2012-05-22 52 views
0

内删除子对象我已经使用EF生成类为我的数据库表:EF从父对象

public partial class Course 
{ 
    public Course() 
    { 
     this.People = new HashSet<People>(); 
    } 

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

    public virtual ICollection<Person> People { get; private set; }  
} 

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

    public virtual Course Course { get; set; } 
} 

正如你可以看到每个课程都有人收藏。我创建了第二个部分类,以便在刷新EF图时我的代码不会被清除。我的问题是如何清除课程对象中的人员列表?

我想:

public partial class Course 
{  
     public void ResetCourse() 
     { 
      this.People.Clear(); 
     } 
} 

,但我得到这个错误:

操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性指定另一个非空值,或者必须删除不相关的对象。

这显然是因为EF实际上并没有删除person对象而只是删除了因为它不能有null键而抛出的SQL之间的关系。

显然我应该使用类似 context.DeleteObject(人)

但是过程中反对它没有参照上下文,我想保持物体内部的代码,以保持它的简单的UI码。

回答

1

而不是使用Course类来管理数据库操作;在使用实体框架时最好使用存储库和单元模式。否则,你的实体总是在他们身上带上背景;这会导致一些问题。

只需创建一个以上下文为参数的课程存储库,并在存储库中使用数据库操作而不是实体本身。参考: Unit of Work and repository patterns

+0

我碰巧使用工作单元的方法,所以你是说我应该把一个函数内部的更新课程和删除人?我同意这样做会工作,但是我的代码比我在这里给出的要多得多,如果我在哪里把所有更新的代码放在UOW中,它将会变得巨大并且很难在后来管理。你碰巧有链接到任何示例UOW模式,涵盖这样的事情? (现在去搜索) – Jammy

+0

实际上你并没有在UOW中放置一个函数。您只需为CRUD操作(或其他需要的操作)创建存储库类。但是所有的操作都是使用UOW持久化的,这使得能够以事务处理的方式执行所有操作。 – daryal