2010-04-25 130 views
2

我正在使用上述技術,並遇到了我所假設的設計問題。SQL,MVC,實體框架

我在我的數據庫中有一個藝術作品表,並且已經能夠將藝術作品(我現在將其視爲數字產品)添加到購物車+ CartLine表中。我有這個系統增加藝術畫廊和用戶帳戶等工作正常。

現在,客戶想要出售T恤,馬克杯和鋼筆等'硬件產品',所以我創建了'HardwareProducts'表。

現在我在兩個表中有兩種不同的產品類型。在HardwareProducts表和Artwork表中,我都使用GUID作爲PK。當顧客將商品添加到購物車時,我將GUID存儲在CartItems表的ProductID列中。

問題是當我通過ORM將LineItem對象放到前端時,數據庫將不知道要引用哪個表。

在OOP中,我可以看到你將如何擁有一個Product類的基類,然後從它驅動出一個DigitalProduct類和HardwareProduct類,但是如何在SQL Server和實體框架中對此進行建模?辦法?

編輯:

這是我在感謝下面的評論時刻在測試應用程序。對我來說這個技巧是利用了與Stephane指出的相似的ORM。它導致我this優秀的文章。

alt text http://img411.imageshack.us/img411/3568/32654541.jpg

允許:

int prodCount = _entities.Product.OfType<ArtWork>().Count(); 
IEnumerable<LineItem> lineItem = _entities.LineItem.Include("Product"); 
int artWorkCount = lineItem.Select(p => p.Product).OfType<ArtWork>().Count(); 

ArtWork prod = new ArtWork(); 
      prod.Price = 2; 
      prod.ProductName = "atlast"; 
      prod.Downloads = 3; 
      prod.GalleryID = 1; 
      _entities.AddToProduct(prod); 
      _entities.SaveChanges(); 

我將它融入我的主要解決方案,將讓你知道,如果我再發現,但我認爲一切都看起來不錯。注意它看起來是提到的類型列,最終並沒有真​​正需要,這是一個驚喜,這要歸功於ORM提供的乾淨解決方案。 Thx全部

+0

非常有趣的場景。我也想學習解決方案,所以如果你找到它,請發佈它:-)。 – Raja 2010-04-25 13:16:21

+0

這是偉大的信息LukLed&Stephane。我意識到我的客戶請求向我的數據庫引入了一個設計問題(它從來不是一個真正的ecom數據庫,但正在迅速成爲一個)。我正在做一些背景閱讀(關於Stephane和繪圖),因爲我們正在研究整合您的解決方案,並且一旦將測試項目放在一起,就會回覆您。 – Anthony 2010-04-25 14:15:27

+0

與英孚:) – 2010-04-25 14:19:08

回答

1

這是一個非常酷的場景,炫耀EntityFramework的一個功能!

您可以有單個表格產品和定義產品類型的類型列。 然後在您的實體數據模型中定義基本實體產品,並創建2個派生實體HardwareProduct和ArtProduct。您可以在映射添加一個條件爲您的孩子實體,像這樣:

編輯:你應該閱讀當ProductTypeID = 1,但我懶惰現在重做截圖;)

inherited entity and condition http://i42.tinypic.com/2ibhqw3.png

請參閱 「當ProductTypeID = 1」

那裏:)

2

這是糟糕的數據庫設計。您應該在基礎表上具有每種產品的ID和常見功能以及具有特定於不同類型產品的功能的擴展表。

實施例:

產品:ID,說明,單價,ProductType(藝術品或硬件)
藝術品:產品ID,年份,尺寸
HardwareProduct:產品ID,其它特徵。

在購物車中您可以存儲產品ID和數量。

由於可以存在更多類別的產品,因此您應該考慮表格存儲特定於產品類別的參數以及存儲其值的另一個表格。

並對您的OOP解決方案發表評論。擁有DigitalProduct和HardwareProduct類可能在開始時很有趣,但商店中的商品可能具有如此多的不同功能,以至於無法將其翻譯爲不同的類。筆有顏色,T恤有尺寸,馬克杯有容量,所以當你開始思考時,馬克杯和T恤,然後是藝術品和T恤之間有更多的區別。那麼爲什麼杯子在同一個地方,T恤和藝術品在別的地方呢?

你一定要看看一些開源的電子商務解決方案,看看它是如何完成的。你的客戶可能想要開始銷售其他類型的產品,你必須考慮設計更通用的解決方案。添加另一個類將不會有效。

+1

同意,這與實體模型中的繼承結合在一起,你很好:) – 2010-04-25 13:41:24