Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# efdb第一映射_C#_Entity Framework_Entity Framework 5_Database First - Fatal编程技术网

C# efdb第一映射

C# efdb第一映射,c#,entity-framework,entity-framework-5,database-first,C#,Entity Framework,Entity Framework 5,Database First,由于EF的这个小怪癖,我的处境令人沮丧。下面是一个简单的行为演示。首先是数据库模式: 正如您所看到的,RestrictedProduct是product的一个特例,我打算用一些特殊代码创建product的子类 现在我导入到EF数据模型: 哎呀!EF发现RestrictedProduct只有两个字段,都是FKs,因此它将其映射为Product和RestrictedProduct之间的一对多关系。所以我回到数据库,在受限产品中添加一个虚拟字段,现在我的EF模型看起来好多了: 但是,这个虚拟字段

由于EF的这个小怪癖,我的处境令人沮丧。下面是一个简单的行为演示。首先是数据库模式:

正如您所看到的,
RestrictedProduct
是product的一个特例,我打算用一些特殊代码创建
product
的子类

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

哎呀!EF发现
RestrictedProduct
只有两个字段,都是FKs,因此它将其映射为
Product
RestrictedProduct
之间的一对多关系。所以我回到数据库,在
受限产品
中添加一个
虚拟
字段,现在我的EF模型看起来好多了:

但是,这个
虚拟
字段既愚蠢又毫无意义。也许我可以删除它?我从DB表和实体模型中去掉字段,然后从DB刷新模型

哦,不!
产品限制
关联以新名称(
RestrictedProduct1
)返回!另外,它不会编译:

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


除了保留
RestrictedProduct
表上的
Dummy
字段外,还有什么方法可以防止这种行为吗?

让我们慢慢来看看您的问题

你需要决定的第一件事是,受限制的产品是否 是产品的特例还是可能的扩展 对每种产品都要进行测试

从您最初的DB方案来看,似乎任何产品都可能 与单个限制的关系,但仅限于单个限制 可以在许多产品中共享。。所以这是一个简单的1对多 这意味着受限产品不是特例 当然是产品!限制是一个独立的实体,没有任何限制 以特定的方式处理产品

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


我看不出您的问题。

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

尝试另一种方法,创建类模型,看看EF代码首先在database@Wim-好主意!我这样做了,生成的DB模型与我开始使用的基本相同。但是从DB刷新并不会破坏EF模型!在EDMX文件的底层XML之间看不到任何明显的区别,但是有很多技术上的错误,我确信其中一定有一些秘密的转换。知道可能是什么吗?不,我帮不了你。如果你真的发现了什么,请告诉我们。@Shaul听起来你在这里有一个很好的领域驱动设计。你确定DB first是适合你的方法吗?我不认为edmx生成器是可定制的,允许您关闭对某些关联的识别。@b我当时的印象是,DB first和code first是非常可互换的,因为您应该从这两种方法中获得非常相同的结果。我错了吗?谢谢你的回答!我理解你为什么问这个问题,但我要转移它。我给出的案例不是我的实际模式,但解释我的系统中的业务规则需要很长时间,这与问题无关。假设
RestrictedProduct
确实是一种特殊的
产品
,具有不同的业务规则,并且类代码将覆盖
Product
中的一些虚拟方法。要添加到我之前的评论中:还假设您有其他
Product
子类,它们也有不同的业务规则。对于我来说,那些只有一个附加字段(如
RestrictionID
)的字段将被生成为关系,而那些有多个字段的字段将获得他们自己的类别,这是行不通的。以何种方式,RestrictedProduct是产品的子类别?它带来了什么?你要解决的问题与面向对象设计有关,而不是EF,如果我们看一个经典的动物园例子:你有一个“动物”类和一个“访客”类,你试图说,因为有些动物可以被访问,所以它们需要被分类。。那是错误的!你可以在你的动物类上访问一个属性-这将是正确的方法。你们需要区分什么时候somthing应该是子类,什么时候somthing仅仅是另一个属性,就像基本规则询问它是否增加了somthing一样。我已经经历了这个过程。我理解子类和属性之间的区别。请把它当作是一个给定的,确实有一个真正的业务需要有一个子类。好的,在这种情况下,你需要设置产品的限制,因为它是你的限制产品的基类,并消除限制产品限制之间的关系。。。但我认为它不再是直观的:)正如你所说,不理想,因为它在概念上确实不可为null,但也不比虚拟字段更糟糕,所以不管怎样+1。。。