2

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

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

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

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

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

4

2 回答 2

4

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

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

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

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

于 2013-08-18T18:05:18.523 回答
1

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

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

我想手动创建一个 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链接实体相同。

于 2013-08-18T13:11:48.383 回答