我有这样的实体:
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和导航属性之间的变化"
下的关系和导航属性