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

Posted giscore

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()期间,实体中的附表的更改不会保存到数据库。详细说明

 

以上是关于EF 使用lambda表达式 更新一对多数据时报错的主要内容,如果未能解决你的问题,请参考以下文章

EF CodeFirst 更新数据库时报错

Include 中使用的 Lambda 表达式无效。 EF6,导航属性

利用EF Core的Lambda表达式和Join进行多表查询

利用EF Core的Lambda表达式和Join进行多表查询

使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a col

动态构建Lambda表达式实现EF动态查询