none
关于EntityFramework CodeFirst删除操作问题 RRS feed

  • 问题

  • 我使用了EF CodeFirst模式,有类似这么2个实体:

    public class Company
        {
            public int ID { get; set; }

            public string Name { get; set; }

            public virtual ICollection<CompanyProduct> CompanyProducts { get; set; }
        }

        public class CompanyProduct
        {
            public int ID { get; set; }

            public string Name { get; set; }

            public int CompanyID { get; set; }

            public virtual Company Company { get; set; }
        }

    public class MainUnitOfWork
            : DbContext
        {

            public IDbSet<Company> Companys { get; set; }
            public IDbSet<CompanyProduct> CompanyProducts { get; set; }

        }

    我想问,我是否可以通过Company导航到CompanyProduct,来删除CompanyProduct的某条数据?

    类似以下操作:

    var q = db.Companys.Find(1);
    q.CompanyProducts.Remove(...);
    db.SaveChanges();

    2012年9月5日 9:02

全部回复

  • Hi,

    这个是完全可以的。只不过按照你这样的写法,在调用SaveChanges的时候会抛出一个异常。这是由于通常一个关系在被割离的时候,外键会被设定为null,但是由于你类型定义外键不能为空。我们可以通过重写SaveChanges来在保存前将外键为空的类型从local中删除,例如:

        public class MainUnitOfWork : DbContext
        {
            public IDbSet<Company> Companies { get; set; }
            public IDbSet<CompanyProduct> CompanyProducts { get; set; }
    
            public override int SaveChanges()
            {
                CompanyProducts.Local.Where(c => c.Company == null).ToList().ForEach(p=>CompanyProducts.Remove(p));
    
                return base.SaveChanges();
            }
        }
    

    这样在调用的时候就不会出错了:
                using (var context=new MainUnitOfWork())
                {
                    var entity = context.Companies.Find(1);
                    entity.ComanyProducts.Remove(context.CompanyProducts.Where(p=>p.Name=="Windows").First());
                    context.SaveChanges();
                }
    


    Alexander Sun [MSFT]
    MSDN Community Support | Feedback to us

    2012年9月6日 8:15
  • 感谢回复,抛异常的问题,这个我倒了解

    你的demo,重写SaveChanges里面的代码,表现出来的,还是得通过CompanyProducts来删除某条数据吧

    我的问题里面,只是举个例子,可能Company下还有其他很多实体,是否一个个都在重写里面写实现?

    根据你的回复,有点可以肯定,q.CompanyProducts.Remove(...); 我这样的操作实现的,仅仅是业务从将两者关系剥离而已,而要删除操作,还是得针对每个实体自身操作

    2012年9月12日 8:48