使用实体框架内的.Remove删除父记录

时间:2014-11-03 02:10:19

标签: c# asp.net-mvc entity-framework

我在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表吗?

1 个答案:

答案 0 :(得分:0)

在EntityFramework中,您可以将Cascading Delete设置为true / false。

<强> If its true  然后两个方法做同样的工作..在第一个你正在做EF的工作,甚至仍然EF将检查是否存在要删除的子项,而在第二个EF执行其定义的工作..

<强> If its false  然后两者都是不同的..第一个是正确的方法,删除子先然后父...而第二个将删除子实体上的父..

默认级联删除为真