避免继承中的“唯一字段”冲突

时间:2011-10-02 18:06:36

标签: c#-4.0 entity-framework-4

我的情况

我有一个带有基类ItemBase的实体模型,它定义了ID,名称和一些其他属性。 “ID”列是标识,“名称”列是基表中的唯一字段。此基类也定义为抽象类。所以是的,它是数据库中的一个表,但是在EF4中我无法创建这个基类的实例。

我有五个不同的实体从基类继承。 (Item1,Item2 ... Item5)因此,所有这些都继承了ItemBase的属性,并且其他属性存储在备用表中。每种类型一张桌子。真的很好!

我的问题

Item2类型的对象可以与Item5的对象具有相同的名称。这会导致问题,因为它们都会在ItemBase表中以记录结束,并且Name字段会发生冲突。那只是讨厌。因此,如果Item2类包含电视制造商的品牌,而Item5包含智能手机制造商的列表,则无法在两个实体集中添加“Samsung”。

我需要一个可以解决这个问题的解决方案,同时保持简单。 (并且没有将Name字段添加到所有子表中,因为YUCK!)建议?

解决这个问题的方法?

因为“Name”在基表中并定义为“Unique”,所以当两个不同的实体类具有相同的名称时,我将最终发生冲突。我需要一个解决方案,其中“Name”在基表中,但它仅对每个子类唯一,对于基类不是唯一的...
我可以改变子实体,在写入表时为名称添加前缀,并在从表中读取时再次删除它。或者我在基表中添加另一个字段,指示链接到它的子类,并使“name”+“link”唯一,而不仅仅是“Name”。这两个解决方案都不是很漂亮,我不清楚如何实现其中之一。那么是否有更好的解决方案,否则,我该如何很好地实现它呢?

1 个答案:

答案 0 :(得分:3)

独特的列无法解决。唯一键需要放在两列上 - 一列指定Name,另一列指定派生实体的类型,但是对于您选择的继承类型(Table-per-type)是不可能的,因为EF不会创建和维护为您增加的专栏。只有每个层次结构表继承,才能实现这一点,其中所有五个子实体都存储在与基类相同的表中,并且存在不同的鉴别器列。

要使用当前设计解决此问题,您必须使用基表上的触发器和一些查询逻辑来查找每个子项的名称是唯一的还是在您的应用程序中完全处理它。