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();

 

时间: 2024-10-10 23:31:03

EF直接更新数据(不需查询)(转)的相关文章

EF 直接修改数据,不再查询数据库

public int UpData(T model, params string[] proNames) { //4.1将 对象 添加到 EF中 DbEntityEntry entry = db.Entry<T>(model); var set = db.Set<T>().Find(DbContextExtensions.GetEntityKey(db, model)); if (set != null) { entry.State = EntityState.Detached;

sqlite学习笔记10:C语言中使用sqlite之查询和更新数据

前面说到的 sqlite_exec() 中的第三个参数, SQLite 将为 sql 参数内执行的每个 SELECT 语句中处理的每个记录调用这个回调函数. 本节添加了两个函数,selectFromTable和updateTable. 实例程序如下: #include <stdio.h> #include <stdlib.h> #include "sqlite/sqlite3.h" #define DB_NANE "sqlite/test.db&quo

如何实现MySQL随机查询数据与MySQL随机更新数据?

以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL随机查询数据 以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了. SELECT * FROM table_name ORDER BY rand() LIMIT 5; MySQ

SQL中Update...Select...的使用,关联查询后进行更新数据

最常用的update语法是: UPDATE <table_name> SET <column_name1> = <value>,SET <column_name2> = <value> 如果我的更新值Value是从一条select语句拿出来,而且有很多列的话,用这种语法就很麻烦 第一,要select出来放在临时变量上,有很多个哦 第二,再将变量进行赋值. 列多起来非常麻烦,能不能像Insert那样,把整个Select语句的结果进行插入呢?就好象下

经验总结16--EF局部更新数据

EF提供更新某个实体的某些数据,而其他数据保留的功能. 1.重新实例一个实体,并给予ID和需要修改的字段.注:此处的实体不能从数据库中查询,只能新的实例. Order order = new Order() { ID = id }; order.Name= "test222"; 2.包含该实体,更新策略为Unchanged,设置需要更新的字段. DbEntityEntry<Order> entry = db.Entry<Order>(order); entry.

CRL快速开发框架系列教程三(更新数据)

本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框架系列教程四(删除数据) CRL快速开发框架系列教程五(使用缓存) CRL快速开发框架系列教程六(分布式缓存解决方案) CRL快速开发框架系列教程七(使用事务) CRL快速开发框架系列教程八(使用CRL.Package) CRL快速开发框架系列教程九(导入/导出数据) CRL快速开发框架系列教程十(

EF实体框架数据操作基类(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

EF实体框架数据操作基类

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

JDBC更新数据实例

在本教程将演示如何在JDBC应用程序中,更新数据库的一个表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式的数据库表中更新数据记录. 要执行以下示例,需要用实际用户名和密码替换这里用户名(username)和密码(password). MySQL或数据库已启动并运行. 所需步骤 使用JDBC应用程序向表中更新数据记录需要以下步骤: 导入包:需要包含包含数据库编程所需的JDBC类的包. 大多数情况下,使用import java.sql.*就足够了.