2012-11-28 51 views
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语句冲突与外键约束 “FK_person_profile

这是我班的一个示例。
东西属性是一个导航键。 在第一选择东西有价值 但在第二次选择里面终于阻止它成为空

修复了删除问题之后,现在我在将对象添加到数据库后遇到同样的问题。 并且重装功能不起作用。
有什么建议吗?

+0

您可以发布您的代码?你的删除函数和抛出错误的方法会很有帮助! –

+0

@MarkOreta:更新问题 – Raika

+3

你的错误是因为有一个**必需的** FK关系,它没有设置为级联删除(它看起来像你有一个配置文件对象)。您需要将关系设为可选,删除配置文件或启用级联删除。 –

回答

2

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

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

使用你的代码的一个例子:

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