0

插入记录时是否可以手动分配外键值?

我不想使用 TransactionScope 或类似的构造。但我确实想在调用 SaveChanges() 之前设置外键值

例如:

EntityX x = new EntityX();
x.Name = "test";
ctx.AddToEntityX(x);

EntityY y = new EntityY();
y.Name = "Test";
y.EntityXID = x.ID; // <--- I want this. Not using a navigation property, but its 0.
ctx.AddToEntityY(y);

ctx.SaveChanges();
4

3 回答 3

0

如果您创建一个新实体,它不会有一个 ID,直到它被持久化。然后你必须从数据库中检索它并得到这个想法。在此示例中,使用导航属性绝对是您的最佳选择。所以而不是:

y.EntityXID = x.ID;

你会用

y.EntityX = x;
于 2011-05-13T15:55:26.953 回答
0

是的,这是可能的,但你必须通过 EntityReference 分配它有很多麻烦:

y.EntityXReference.EntityKey = new EntityKey("Enitites.YSet", "Id", x.id);

有关参数的详细信息,请参见EntityKey 构造函数

有关其他参考,请参阅技巧 7 - 如何在 .NET 3.5 SP1 中伪造外键属性

于 2011-04-20T19:59:55.203 回答
0

我认为在您的示例中使用导航属性没有任何问题。也不需要事务范围,因为在SaveChanges内部使用事务。

从理论上讲,如果您删除概念模型(EDMX 设计器)中的所有关联并手动删除 EDMX 文件的 SSDL 部分中的所有关联,然后将 FK 映射到新的标量属性,您应该能够做到这一点。但是您会大大降低 EF,以至于您甚至不应该使用它并恢复到 ADO.NET 或 Linq-to-sql。此外,一旦您触摸 EDMX 的 SSDL 部分,您就不能再使用从数据库更新

于 2011-04-20T20:05:26.463 回答