尝试删除后导航键丢失

时间:2012-11-28 12:26:43

标签: entity-framework ef-code-first

我有代码第一实体框架 当我试图从具有外键到其他表的表中删除行时,我得到一个异常。在我尝试再次加载数据后处理异常后,我尝试删除的所选项目的导航键变为 null

为什么会发生这种情况,我该如何解决呢。

删除过程非常简单:

public class Person
{
     public int ID {get;set;}
     public string Name {get;set;}

     public Something Something {get;set;}
     public ICollection<Profile> Profile {get;set;}
}

try 
{
    var p = en.Person.First(t => t.ID == 14);
    //p.Something here is not null;
    en.Remove(p)
    en.SaveChanges(); // I'm get an exception here
} 
catch { /*error handling */} 
finally 
{
    var p = en.Person.First(t => t.ID == 14);
    //but p.Something here is null;
}

但是在 en.SaveChange()中我得到了一个例外。

  

DELETE语句与FOREIGN KEY约束冲突   “FK_person_profile

这是我班上的一个样本 SomeThing 属性是导航键。 首先选择 Something 有值。 但是在第二个选择内部最终阻止它变为空。

修复删除问题后,我在向数据库添加对象后遇到了同样的问题。 并且重新加载功能没有帮助 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我想我理解你的问题 - 你正在删除一个实体,它会导致错误并且你想要恢复。但是,当您再次从当前上下文中获取实体时,在您的finally块中,这是不正确的。

问题在于您期望从数据库重新加载您的上下文,但这不是它的工作原理。你实际做的是回到你的上下文,这是一个工作单元并在内存中检索实体,因为你的检索实体被标记为删除,所以它的属性没有被加载。如果要从数据库刷新,则需要使用DbEntityEntry.Reload完全使用条目重新加载实体。

使用您的代码作为示例:

var p = en.Person.First(t => t.ID == 14);
en.Entry(p).Reload();