一、一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最近看DbContext相关内容发现是可以只更新部分字段,原来一直的操作方式是有问题下面粘代码详细说明。

1、首先看全部更新字段情况

    [TestMethod]
public void UpdateCustomer()
{ //Customer customer3 = new Customer();
//customer3.Id = 22;
//customer3.CustName = DateTime.Now.ToString("yyMMddHHmmssff");
//customer3.CustAddress = "北京25"; CustoemrRepository cuR = new CustoemrRepository();
Customer cuM = cuR.GetEntities(x => x.Id == ).FirstOrDefault();
cuM.CustAddress = "北京0614";
int row = cuR.UpdateModel(cuM);
}
   /// <summary>
/// 修改实体对象
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateModel(TEntity model)
{
//if (unDbContext.Entry<TEntity>(model).State == System.Data.Entity.EntityState.Detached)
//{ // unDbContext.Entry(model).State = EntityState.Modified;
//} unDbContext.Entry(model).State = EntityState.Modified;
return unDbContext.SaveChanges();
}

这种修改方式生成的sql是

exec sp_executesql N'UPDATE [dbo].[Customer]
SET [CustName] = @, [CustCode] = NULL, [CustAddress] = @
WHERE ([Id] = @)
',N'@ nvarchar(max) ,@ nvarchar(max) ,@ int',@0=N'',@1=N'北京0614',@2=22

将Cutomer记录的全部字段更新了

如果将更新方式换做这样写

 /// <summary>
/// 修改实体对象
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateModel(TEntity model)
{
if (unDbContext.Entry<TEntity>(model).State == System.Data.Entity.EntityState.Detached)
{
unDbContext.Entry(model).State = EntityState.Modified;
} return unDbContext.SaveChanges();
}

生成sql为

exec sp_executesql N'UPDATE [dbo].[Customer]
SET [CustAddress] = @
WHERE ([Id] = @)
',N'@ nvarchar(max) ,@ int',@0=N'北京0614',@1=22

可以看出这样只更新了 CustAddress 这个字段其它字段没有更新,这是因为 这句代码 unDbContext.Entry(model).State = EntityState.Modified; 没有执行,因为该数据记录是从数库中取出来的所以你修改记录相应字段后Entityframework会自动跟踪

修改字段 直接 unDbContext.SaveChanges();  就可以将修改记录保存到数据库,且只更新修改字段。 所以从数据库中取的数据记录“ unDbContext.Entry(model).State = EntityState.Modified;”这句不需要。

下面说一下这句
unDbContext.Entry(model).State = EntityState.Modified;
将其状态设为 EntityState.Modified 是针对要保存的实体对象不是从数据库中取出,而是在代码中 自己New的对象不是从数据库中取出来的,这时候需要
unDbContext.Entry(model).State = EntityState.Modified; 将其状态修改且Dbcontext为对它有相应修改处理,如果不设置对象将不在Dbcontext中会报错。

二、下面说一下怎样自己实例化的对象 不从数据库中取 然后更新数据记录,这样减少了一次数据库获取数据会提高相应效率,当然不太要求性能的系统中还是从数据库中取比较简单,下面做了一个简单实现大家感兴趣可以详细扩展。
   [TestMethod]
public void UpdateCustomer()
{ // 自己实例化要更新对象 省了访问数据库获取数据时间
Customer customer3 = new Customer();
customer3.Id = ;
customer3.CustAddress = "北京25";
List<string> listRmoveFiled = new List<string>();
listRmoveFiled = "CustCode,CustName".Split(',').ToList<string>(); CustoemrRepository cuR = new CustoemrRepository();
int row = cuR.UpdateModel(customer3,listRmoveFiled);
}
具体实现部分简单处理(大家可以写的风骚,精湛些)
   /// <summary>
/// 修改实体对象
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateModel(TEntity model, List<string> listRemoveField = null)
{ // 排除不需更新的字段
foreach (string field in listRemoveField)
{
if (field != "Id")
unDbContext.Entry(model).Property(field).IsModified = false;
} if (unDbContext.Entry<TEntity>(model).State == System.Data.Entity.EntityState.Detached)
{
//将model追加到EF容器
unDbContext.Entry(model).State = EntityState.Modified;
}
return unDbContext.SaveChanges();
}
这样处理就可以省了从数据库中获取再修改,自己直接实例化更新部分字段就可以直接更新到数据库中。写到这里对这一块的整理也就结束了。
												

关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录的更多相关文章

  1. mysql 从数据库中获取多条记录,二维展示数据

    展示要求: 客户/日期 2017-10-16 1017-10-17 2017-10-18 客户1       客户2       数据库中数据: 解决办法: 1.新建一个实体类:客户名称.客户数据(A ...

  2. 当客户端提交更新数据请求时,是先写入edits,然后再写入内存的

    http://blog.sina.com.cn/s/blog_6f83c7470101b7d3.html http://blog.csdn.net/slq1023/article/details/49 ...

  3. 使用python读取配置文件并从mysql数据库中获取数据进行传参(基于Httprunner)

    最近在使用httprunner进行接口测试,在传参时,用到了三种方法:(1)从csv文件中获取:(2)在config中声名然后进行引用:(3)从函数中获取.在测试过程中,往往有些参数是需要从数据库中获 ...

  4. Oracle查询数据库中所有表的记录数

    1.Oracle查询数据库中所有表的记录数,但是有可能不准建议用第二种方式进行查询 select t.table_name,t.num_rows from user_tables t 2.创建orac ...

  5. Django Form 实时从数据库中获取数据

    修改 models.py 添加 class UserType(models.Model): caption = models.CharField(max_length=32) 执行命令,生成数据库 p ...

  6. Dynamics CRM 插件Plugin中获取和更新时间字段值的准确转换

    前面两篇介绍了后台代码通过组织服务获取更新时间字段.窗体javascript通过Odata获取更新时间字段,最后篇来实验下在插件中的获取和更新时间字段是否需要时制的转化,为何说是最后篇呢,因为在CRM ...

  7. [SQL]查询某一个字段在某一段时期数据库中使用到的记录

    有些时候我们常常须要哪里用到了一些表,又或者什么时候运行了某一个存储过程.整理出了在某段时期内数据库运行的sql查询.也能够查询到数据库中某些字段的存放处.非常好非常强大.希望能帮到大家~ SELEC ...

  8. PHP查询数据库中满足条件的记录条数(二种实现方法)

    在需要输出网站用户注册数或者插入数据之前判断是否有重复记录时,就需要获取满足条件的MySQL查询的记录数目,接下来介绍两种查询统计方法,感兴趣的朋友可以了解下啊,或许对你有所帮助     在需要输出网 ...

  9. PHP如何实现在数据库随机获取几条记录

    本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法.PHP实例分享给大家供大家参考,具体如下: 为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法 ...

随机推荐

  1. spring自学历程

    spring几大核心功能 1.IOC/DI(控制反转/依赖注入) IOC是什么?IOC完成的事情是原先程序员主动通过new实例化对象的事情,转交给spring负责 IOC最大的作用是:解耦,程序员不需 ...

  2. 十次艳遇单例设计模式(Singleton Pattern)

    1.引言 单例设计模式(Singleton Pattern)是最简单且常见的设计模式之一,在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访 ...

  3. 在MVC4.5.1中使用Ninject

    看完Pro ASP.NET MVC5的前14章之后,终于开始了自己的项目搭建. 打算在实际项目中使用Ninject 但是总是出现各种问题.这里记录一下 在书中使用的Ninject的版本是: Insta ...

  4. 记录java ftp下载图片只有96KB的问题

    public InputStream downloadFile(String path) { if(StringUtils.isBlank(path)) { return null; } connne ...

  5. 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27

    最近博主由于工作原因需要把之前安装好的的mysql 5.6.44版本卸载,然后安装mysql 5.7.*版本. 前提:为什么要升级到5.7版本? 因为博主在5.6版本上执行脚本时候报出异常:to yo ...

  6. 【记录】安装mysql Install/Remove of the Service Denied!错误的解决办法

    最近安装 Mysql 5.6版本,在安装的过程中出现Install/Remove of the Service Denied!错误!(本人Win10 系统) 出现此问题是由于当前用户权限不够,需要以管 ...

  7. grep 正则2

    基本正则表达式所定义的元字符 元字符 作用 例子 例子说明 ^ 行首定位符 ^ty 匹配"t"开头,后面紧跟一个"y"的字符串 $ 行尾定位符 txt$ 匹配以 ...

  8. 关于 webpack 的研究

    webpack的官网:http://webpack.github.io/ 安装webpack 演示项目安装,使用全局安装:npm install webpack -g 真正的项目使用依赖式安装,保证在 ...

  9. java静态代理及动态代理(学习示例)

    1.接口 public interface Channel { void send(); } 2.实现类(可以为各种不同实现) public class ChannelImpl implements ...

  10. C之输入输出函数(1) -- fgets()

    https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/fgets.htm #include <stdio.h> ...