1

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

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

删除过程非常简单:

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 have value。但在第二个选择里面最终阻止它变为空。

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

4

1 回答 1

1

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

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

使用您的代码示例:

var p = en.Person.First(t => t.ID == 14);
en.Entry(p).Reload();
于 2012-11-28T13:23:46.867 回答