EF 使用lambda表达式 更新一对多数据时报错

1、需求 

    更新一对多表中的附表数据,表结构如下:

2、思路

   个人觉得一个个去对比关联的附表数据是删除还是添加比较麻烦,就直接清空主表关联的附表,然后重新建立关联关系。

3、弊端

   如果附表(前提是附表的ID是自增的)还关联着其它表就会丢失他们之间的关联关系

4、主要代码

            //创建语句查询查询出主表(WaterSamplingPoint)和附表(ExpansionCleaningRecord)
            var wsp = _db.WaterSamplingPoint.Include(i => i.ExpansionCleaningRecords).Where(p => p.Id == model.Id).FirstOrDefault();

            if (wsp == null)//如果主表记录不存在就添加记录
            {
                _db.WaterSamplingPoint.Add(model);
            }
            else //有主表记录就修改主表记录和更新附表数据
            {
                _db.ExpansionCleaningRecord.RemoveRange(wsp.ExpansionCleaningRecords);//标记和主表关联的附表数据为删除状态(可加可不加,不加会产生冗余数据)
                wsp.ExpansionCleaningRecords = model.ExpansionCleaningRecords;        //将前台传过来的主表关联的附表数据赋给需要修改的数据库主表数据
                _db.Entry(wsp).State = System.Data.Entity.EntityState.Modified;       //将数据库中的主表记录标记为修改
                _db.Entry(wsp).CurrentValues.SetValues(model);                        //更新主表属性
            }
            int count = _db.SaveChanges();//执行修改命令
            if (count > 0)
            {
                return true;
            }
            return false;

5、注意事项

1)、红色代码可加可不加,不添加会产生冗余数据

2)、在查询语句中添加.AsNoTracking()语句数据库将不会对附表进行增删改的操作,如果有红色代码还会报“无法删除此对象,因为未在 ObjectStateManager 中找到它”的错误,如下图所示:

使用“AsNoTracking”表示不跟踪查询的实体,则在SaveChanges()期间,实体中的附表的更改不会保存到数据库。详细说明

 

posted on 2019-03-14 10:15  Geography爱好者  阅读(400)  评论(0编辑  收藏  举报

导航