【问题标题】:Entity Framework hides n to n table实体框架隐藏 n 到 n 表
【发布时间】:2013-08-20 08:42:10
【问题描述】:

我使用 SQL Server 管理工作室创建了以下表(我不能让 EF 创建数据库,因为我需要自定义索引以及其他东西)。

表 A (AId) 表 B (BId) 表 AB(AId, BId)

设置了外键约束,因此 A - B 是 n-n 关系。

现在,当我将模型导入 EF 时,关系显示为 * - *(这是正确的),但表 AB 消失了。这不是我想要的!我希望能够手动管理关系。如何让 EF 显示此表?

(原因是 EF 通过强类型对象管理关系的方式是反性能 - 例如,我想手动创建一个 B 并将其链接到某个 As(我知道 ID)而不选择那些 As 并将其添加到 B 的集合中)

【问题讨论】:

标签: asp.net sql-server visual-studio entity-framework


【解决方案1】:

当您首先通过数据库创建模型时,无法强制 EF 将链接表公开为实体 - 除非您以 EF 不将表视为纯多对多链接的方式更改架构不再使用表,例如通过向表中添加“虚拟列”。但是,当您使用 Code-First 时,您可以手动为链接表创建一个实体,该实体在 A 和 AB 之间以及 B 和 AB 之间具有两个一对多关系。

我不相信你的论点为什么要这样做......

我想手动创建一个 B 并将其链接到一些 As(我知道 ID) 无需选择那些 As 并将其添加到 B 的集合中。

...因为如果您知道键值,则不需要从数据库中加载任何实体。您可以使用附加的存根实体来创建关系并将条目写入链接表:

var newB = new B { As = new List<A>() };
foreach (var aId in someAIdCollection)
{
    var existingA = new A { Id = aId };
    context.As.Attach(existingA);
    newB.As.Add(existingA);
}
context.Bs.Add(newB);
context.SaveChanges();

此处不涉及数据库查询,生成的 SQL 命令与直接插入 AB 链接实体相同。

【讨论】:

    【解决方案2】:

    正如 Slauma 所说,可以添加一个虚拟字段,但更重要的是,您可以删除该虚拟字段并仍然拥有链接表。

    简单地创建表 AB,例如添加一个名为“Dummy”的额外列。从此表生成您的模型。该表现在将包含在模型中。

    现在进入数据库并删除“Dummy”列。

    您现在可以从数据库中刷新模型,简单地删除“虚拟”列的映射。现在,您的 EF 模型中有链接表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2011-10-09
      • 2012-03-04
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多