zoukankan      html  css  js  c++  java
  • 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()期间,实体中的附表的更改不会保存到数据库。详细说明

  • 相关阅读:
    UITextView 实现placeholder的方法
    15个重要的Android代码
    Java 网络文件传输
    iPhone打包步骤
    (转)android开发中WebView的使用(附完整程序)
    来自老外用jquery实现的内容隐藏代码
    AJAX实现页面选项卡、隔行换色、弹出层功能代码
    JavaScript防FLASH效果的下拉菜单导航代码
    CSS打造全兼容(IE6、IE7、FF)的下拉导航菜单
    很简单的CSS黑色线条滑动门代码
  • 原文地址:https://www.cnblogs.com/GIScore/p/10528510.html
Copyright © 2011-2022 走看看