由于EF的这个小怪癖,我感到很沮丧。这是一个简单的行为演示。首先是数据库架构:
如您所见,RestrictedProduct
是产品的一个特例,我打算使用一些特殊代码创建Product
的子类。
现在我导入到EF数据模型:
糟糕! EF看到RestrictedProduct
只有两个字段,都是FK,因此它将其映射为Product
和Restriction
之间的一对多关系。所以我回到数据库并向Dummy
添加RestrictedProduct
字段,现在我的EF模型看起来好多了:
但Dummy
字段是愚蠢而毫无意义的。也许我可以删除它?我从DB表和实体模型中删除了该字段,然后从DB刷新模型...
哦,不! Product-Restriction
关联以新名称(RestrictedProduct1
)返回!另外,它不会编译:
错误3034:从第(x,y)行开始映射片段时出现问题:具有可能不同键的两个实体映射到同一行。确保这两个映射片段将AssociationSet的两端映射到相应的列。
有没有办法阻止此行为,是否在Dummy
表上保留RestrictedProduct
字段?
答案 0 :(得分:2)
我刚遇到同样的问题,作为将虚拟字段放在RestrictedProduct
表中以强制创建实体的替代方法,您还可以使RestrictedProduct.RestrictionId
字段为空,EF将为然后为它生成一个实体。然后,您可以将其修改为使用继承,任何后续“从数据库更新模型”都不会导致不需要的导航属性。不是一个很好的解决方案,而是一个解决方法。
答案 1 :(得分:1)
让我们慢慢走进你的问题。
您需要决定的第一件事是限制产品是否 真的是产品的特殊情况,还是可能的延伸 每个产品。
从您原来的数据库方案看来,似乎任何产品都有 与单一限制的关系,但是单一限制 可以在许多产品之间共享..所以这是一个简单的1对多 这种情况意味着限制产品不是特例 产品!限制是一个没有任何东西的独立实体 以特定方式处理产品。
因此,在您的计划的第一次输入中,EF是正确的: 1.产品可以有0或1个限制。 2.限制是另一个可以与许多产品相关的实体。
我没有看到你的问题。