没有导航属性的外键值

时间:2011-04-20 19:41:58

标签: c# .net entity-framework .net-3.5 navigation-properties

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

我不想使用TransactionScope或类似的构造。但我确实想在调用SaveChanges()

之前设置foreignkey值

例如:

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();

3 个答案:

答案 0 :(得分:0)

是的,这是可能的,但你需要通过EntityReference分配它很多麻烦:

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

EntityKey Constructor  有关参数的详细信息

有关其他参考,请参阅Tip 7 - How to fake Foreign Key Properties in .NET 3.5 SP1

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

y.EntityXID = x.ID;

你会用

y.EntityX = x;