• EF直接更新数据(不需查询)


    EF中会为每个 管理的 实体对象 创建一个代理包装类对象,其中会跟踪 实体对象 的状态和每个属性的状态;

    一、通常使用EF更新的方式,先查询出要修改的数据,然后再修改新的值;实体对象被修改的属性 在 代理包装类对象里 的对应属性状态会被修改记录下修改状态,等到调用SaveChanges时,EF会遍历其管理的每个实体对象,并根据其 包装类对象 的状态,生成增删改查sql语句并执行;       此例中修改操作,会生成 修改的sql语句(注意:此处只为修改过的属性生成sql语句),最后执行。       缺点:修改先还要查询,难受~~~~

    复制代码
     1 //1.先查询要修改的原数据
     2 Models.BlogArticle modelNew = db.BlogArticles.Where(a => a.AId == model.AId).FirstOrDefault();
     3 
     4 //2.设置修改后的值
     5 modelNew.ATitle = "新的数据";
     6 modelNew.AContent = "新的数据~~~~~~";
     7 modelNew.ACate = 12;
     8 
     9 //3.跟新到数据库
    10 db.SaveChanges();
    复制代码

    二、为避免先查询数据库,可以直接将 被修改的实体对象 添加到 EF中管理(此时为附加状态Attached),并手动设置其为未修改状态(Unchanged),同时设置被修改的实体对象 的 包装类对象 对应属性为修改状态。      优点:修改前不需要查询数据库。

    复制代码
     1 //0.0创建修改的 实体对象
     2 Models.BlogArticle model = new BlogArticle();
     3 model.AId = 12;
     4 model.ATitle = "新的数据";
     5 model.AContent = "新的数据~~~~~";
     6 
     7 //0.1添加到EF管理容器中,并获取 实体对象 的伪包装类对象
     8 DbEntityEntry<Models.BlogArticle> entry = db.Entry<Models.BlogArticle>(model);
     9 
    10 //**如果使用 Entry 附加 实体对象到数据容器中,则需要手动 设置 实体包装类的对象 的 状态为 Unchanged**
    11 //**如果使用 Attach 就不需要这句
    12 entry.State = System.Data.EntityState.Unchanged;
    13 
    14 //0.2标识 实体对象 某些属性 已经被修改了
    15 entry.Property("ATitle").IsModified = true;
    16 entry.Property("AContent").IsModified = true;
    17 
    18 //3.跟新到数据库
    19 db.SaveChanges();
  • 相关阅读:
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    Python for Data Science
    软件工程实践总结
  • 原文地址:https://www.cnblogs.com/zhhq/p/3423260.html
Copyright © 2020-2023  润新知