2012-05-22 53 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