5

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

在此处输入图像描述

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

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

在此处输入图像描述

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

在此处输入图像描述

但那个Dummy领域是愚蠢和毫无意义的。也许我可以删除它?我从数据库表和实体模型中删除了字段,然后从数据库中刷新模型......

在此处输入图像描述

不好了!Product-Restriction协会以新名称 ( ) 回来了RestrictedProduct1!另外,它不会编译:

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

Dummy除了将字段保留在RestrictedProduct表格上之外,有什么方法可以防止这种行为?

4

2 回答 2

2

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

于 2013-03-19T02:12:12.367 回答
1

让我们慢慢解决您的问题。

您需要确定的第一件事是,受限产品是否真的是产品的特殊情况,或者它是否可能是每个产品的扩展。

从您的原始数据库方案看来,任何产品都可能与单个限制有关,但是单个限制可以在许多产品之间共享。所以这是一个简单的一对多情况,这意味着受限产品不是产品!限制是一个独立的实体,与特定的产品无关。

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

我没有看到你的问题。

于 2013-01-31T09:57:28.450 回答