我有代码第一实体框架 当我试图从具有外键到其他表的表中删除行时,我得到一个异常。在我尝试再次加载数据后处理异常后,我尝试删除的所选项目的导航键变为 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 有值。 但是在第二个选择内部最终阻止它变为空。
修复删除问题后,我在向数据库添加对象后遇到了同样的问题。 并且重新加载功能没有帮助 有什么建议吗?
答案 0 :(得分:2)
我想我理解你的问题 - 你正在删除一个实体,它会导致错误并且你想要恢复。但是,当您再次从当前上下文中获取实体时,在您的finally块中,这是不正确的。
问题在于您期望从数据库重新加载您的上下文,但这不是它的工作原理。你实际做的是回到你的上下文,这是一个工作单元并在内存中检索实体,因为你的检索实体被标记为删除,所以它的属性没有被加载。如果要从数据库刷新,则需要使用DbEntityEntry.Reload完全使用条目重新加载实体。
使用您的代码作为示例:
var p = en.Person.First(t => t.ID == 14);
en.Entry(p).Reload();