【问题标题】:Foreign key values without navigation properties没有导航属性的外键值
【发布时间】:2011-08-09 19:03:25
【问题描述】:

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

我不想使用 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();

【问题讨论】:

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


    【解决方案1】:

    是的,这是可能的,但是你必须通过 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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 示例代码是为了反映我需要实现的目标。我主要将它用于延迟加载和为 EF4 做准备。 (所以 linq to sql 不是一个选项)。我知道我可以在 4 中做我想做的事,但这个项目仍然是 3.5。
      • 不会那么容易的。 EFv4 中的外键关联是完全不同的野兽,它可以在您迁移后显着改变应用程序的行为:stackoverflow.com/questions/5281974/…
      【解决方案3】:

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

      y.EntityXID = x.ID;
      

      你会使用

      y.EntityX = x;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多