2014-11-03 66 views
0

我有asp.net mvc web應用程序中的以下模型類。使用.Remove insdie實體刪除父記錄框架

public partial class Country 
    { 
     public Country() 
     { 
      this.Depts = new HashSet<Dept>(); 
     } 

     public int CountryID { get; set; } 
     public string CountryNAme { get; set; } 

     public virtual ICollection<Dept> Depts { get; set; } 
    } 

public partial class Dept 
    { 
     public Dept() 
     { 
      this.Emps = new HashSet<Emp>(); 
     } 

     public int DeptID { get; set; } 
     public string Name { get; set; } 
     public Nullable<int> OptionalCountryID { get; set; } 

     public virtual Country Country { get; set; } 
     public virtual ICollection<Emp> Emps { get; set; } 
    } 

現在讓我們說,我想刪除一個母國的對象並設置相關countryID FK DEPT表爲空內。如此看來,我可以這樣做,使用任何這些方法: -

[HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(int id) 
     { 
      Country country = db.Countries.Single(a=>a.CountryID == id); 
      foreach(var c in country.Depts.ToList()) 
      { 
       country.Depts.Remove(c); 


      } 
     db.Countries.Remove(country); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

,這將有同樣的結果: -

public ActionResult DeleteConfirmed(int id) 
     { 
      Country country = db.Countries.Include(a=>a.Depts).Single(a=>a.CountryID == id); 

      db.Countries.Remove(country); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

那麼,有沒有這兩種方法之間的差異,似乎既會刪除Parent對象並將CountryID FK設置爲​​null insdie Dept表?

+1

EF級聯相關對象的刪除;第一個代碼示例只是做了EF爲您做的不必要的工作,就像您在第二個代碼示例中發現的那樣。 – 2014-11-03 02:23:27

+0

@BradRem但讓我說設置Cascade爲false將如何影響這兩種方法?並且是Cascade裏面的EF和我們在sql server數據庫裏面使用的Cascade是一樣的嗎? – 2014-11-04 11:12:05

+1

我相信EF中的Cascade和SQL Server中的Cascade是一樣的。如果您在部門中使用的不是可空的外鍵,那麼這兩種方法會有所不同,因爲當您刪除引用的國家/地區記錄時,SQL服務器會嘗試刪除部門記錄;沒有Cascade,你會得到例外,因爲部門必須指向一個國家。 – 2014-11-04 16:08:11

回答

0

在EntityFramework中,您可以將他級聯刪除設置爲true/false。

If its true 那麼這兩個方法做同樣的工作。在第一個你正在做EF的工作,甚至還EF會檢查是否存在兒童進行刪除,而在第二EF這樣做,因爲它定義了它的工作。 。

If its false 那麼這兩個是不同的。首先一個是要刪除的孩子正確的做法首先那麼父..而第二隻會刪除子實體父..

默認級聯刪除爲真

+0

但如果我設置Cascades刪除爲假,那麼我認爲我的第二種方法會引發一個異常,如果父記錄有孩子,並且它不會只刪除子實體上的父母,就像你提到的那樣。 ? – 2014-11-04 11:09:12

+0

您是否嘗試過面對您提到的異常?因爲你已經設置了可以空的國家ID,所以可能得不到那個.. – 2014-11-04 12:42:38