为什么EF在未添加实体状态时不更新FK列?

时间:2015-06-14 04:59:24

标签: c# .net entity-framework ef-code-first entity-framework-5

我有这样的实体:

 public class Entity1
    {
        public short Id { get; set; }
        public int Entity2Id { get; set; }
        public virtual Entity2 Entity2 { get; set; }
    }

并且有这样一对多的关系:

  this.HasRequired(m => m.Entity2)
            .WithMany()
            .HasForeignKey(m => m.Entity2Id)
            .WillCascadeOnDelete(false);

这是我无法理解的思想:

例如,如果我首先将实体状态更改为Added,则evertyhting工作正常:

context.Entry(entity1).State = System.Data.EntityState.Added;
entity1.Entity2.Id = 541;

 // Since this line `entity1.Entity2Id` value is 0.
 context.Entry(entity1.Entity2).State = System.Data.EntityState.Unchanged;
 // But now everything is fine, because `entity1.Entity2Id` value is 541 also.

 context.Entry(entity1).State = System.Data.EntityState.Unchanged;

但是,我不想将状态更改为Added,当我删除第一行时,发生了此异常:

  

发生了参照完整性约束违规:属性   定义引用约束的值不一致   在关系中的主要和依赖对象之间。

Beacuse,entit1.Entity2Id != entity1.Entity2.Id

而且,我不想手动更改价值。

如何在不将状态更改为Added的情况下使其工作?

更新

我更多地调查了这个问题。从So question:

开始

这称为属性修正,过去由生成的代理自动完成。但是,使用DbContext不再是这种情况。根据这个Connect问题,这是设计的。

  

您好,DbContext模板实际上并没有生成那些类   将用作更改跟踪代理 - 只是延迟加载代理   (不做修复)。我们做出这个决定是因为变更跟踪   代理很复杂,有很多细微差别   让开发人员感到困惑。如果你想要修复之前发生   SaveChanges你可以调用myContext.ChangeTracker。 DetectChanges 。 〜EF   队

另一种方法是调用DbContext.Entry(实体),它将同步实体。本文描述了这一点:"同步FK和导航属性之间的变化"

下的关系和导航属性

0 个答案:

没有答案