2010-04-25 92 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