我有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表?
EF級聯相關對象的刪除;第一個代碼示例只是做了EF爲您做的不必要的工作,就像您在第二個代碼示例中發現的那樣。 – 2014-11-03 02:23:27
@BradRem但讓我說設置Cascade爲false將如何影響這兩種方法?並且是Cascade裏面的EF和我們在sql server數據庫裏面使用的Cascade是一樣的嗎? – 2014-11-04 11:12:05
我相信EF中的Cascade和SQL Server中的Cascade是一樣的。如果您在部門中使用的不是可空的外鍵,那麼這兩種方法會有所不同,因爲當您刪除引用的國家/地區記錄時,SQL服務器會嘗試刪除部門記錄;沒有Cascade,你會得到例外,因爲部門必須指向一個國家。 – 2014-11-04 16:08:11