我在asp.net mvc web应用程序中有以下模型类。
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; }
}
现在假设我要删除父国家/地区对象,并将Dept表中的相关countryID FK设置为null。所以我似乎可以使用以下任何一种方法: -
[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而不是Dept表吗?
答案 0 :(得分:0)
在EntityFramework中,您可以将Cascading Delete设置为true / false。
<强> If its true
强>
然后两个方法做同样的工作..在第一个你正在做EF的工作,甚至仍然EF将检查是否存在要删除的子项,而在第二个EF执行其定义的工作..
<强> If its false
强>
然后两者都是不同的..第一个是正确的方法,删除子先然后父...而第二个将删除子实体上的父..
默认级联删除为真