EF DB-first映射混乱

时间:2013-01-30 09:10:57

标签: c# entity-framework entity-framework-5 database-first

由于EF的这个小怪癖,我感到很沮丧。这是一个简单的行为演示。首先是数据库架构:

enter image description here

如您所见,RestrictedProduct是产品的一个特例,我打算使用一些特殊代码创建Product的子类。

现在我导入到EF数据模型:

enter image description here

糟糕! EF看到RestrictedProduct只有两个字段,都是FK,因此它将其映射为ProductRestriction之间的一对多关系。所以我回到数据库并向Dummy添加RestrictedProduct字段,现在我的EF模型看起来好多了:

enter image description here

Dummy字段是愚蠢而毫无意义的。也许我可以删除它?我从DB表和实体模型中删除了该字段,然后从DB刷新模型...

enter image description here

哦,不! Product-Restriction关联以新名称(RestrictedProduct1)返回!另外,它不会编译:

  

错误3034:从第(x,y)行开始映射片段时出现问题:具有可能不同键的两个实体映射到同一行。确保这两个映射片段将AssociationSet的两端映射到相应的列。

有没有办法阻止此行为,是否在Dummy表上保留RestrictedProduct字段?

2 个答案:

答案 0 :(得分:2)

我刚遇到同样的问题,作为将虚拟字段放在RestrictedProduct表中以强制创建实体的替代方法,您还可以使RestrictedProduct.RestrictionId字段为空,EF将为然后为它生成一个实体。然后,您可以将其修改为使用继承,任何后续“从数据库更新模型”都不会导致不需要的导航属性。不是一个很好的解决方案,而是一个解决方法。

答案 1 :(得分:1)

让我们慢慢走进你的问题。

您需要决定的第一件事是限制产品是否 真的是产品的特殊情况,还是可能的延伸 每个产品。

从您原来的数据库方案看来,似乎任何产品都有 与单一限制的关系,但是单一限制 可以在许多产品之间共享..所以这是一个简单的1对多 这种情况意味着限制产品不是特例 产品!限制是一个没有任何东西的独立实体 以特定方式处理产品。

因此,在您的计划的第一次输入中,EF是正确的: 1.产品可以有0或1个限制。 2.限制是另一个可以与许多产品相关的实体。

我没有看到你的问题。

相关问题