在使用Entity Framework作为ORM来存取数据的过程中,最常规的操作就是对数据对象的更新。本文将会包含如何Attach Entity到一个数据Context中,以及如何使用EntityState字段状态来保存数据变化。

文本参考了如下两篇文章:

https://msdn.microsoft.com/en-us/data/jj592676

https://stackoverflow.com/questions/30987806/dbset-attachentity-vs-dbcontext-entryentity-state-entitystate-modified

当要做数据更新时,我们通常会使用如下代码:

context.Entity(entity).State = EntityState.Modified;

context.SaveChanges();

context.Entity(entity).State = EntityState.Modified; 这句代码不仅会将entity attaching到当前的context中,而且还会告诉context这个entity已经发生了变化。当执行savechanges()时,EF会使用update语句将entity中所有的字段全部更新。

上面的这种方式虽然方便,但是在某些时候也会带来效率上的浪费。如果我们只是想更新其中的某个或者某些字段而不是全部字段的时候,使用这种方式就不必要了。那么该如何操作,才能让Entity Framework精确的保存我们想要变更的字段呢?我们可以使用Dbset.Attach(entity)。

Dbset.Attach(entity)只是会将entity attach到context中,而不会告诉context这个实体已经发生修改。所以如果你只是attach entity而之后不做任何处理的话,savechanges()操作将不会有任何变化。所以它和context.Entity(entity).State = EntityState.Unchanged是相同的。要保存个别字段,需要将entity更改之后再调用savechanges方法。请参见下面的代码样例。

代码样例:

下面使我们定义的实体以及它们的Context:

 public class Department
{
public int Id {get;set;}
public string Name {get;set;}
public DateTime CreateTime {get;set;} public int DepLeadID { get; set; } [ForeignKey("DepLeadID")]
public DepLead Lead {get;set;}
}
 public class DepLead
{
public int Id {get;set;}
public string name {get;set;}
public int age {get;set;}
}
 public class Context : DbContext
{
public Context() : base("XXX")
{
}
public DbSet<Department> Departments { get; set; }
public DbSet<DepLead> DepLeads { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
} }

如果我们使用如下方式更新数据:

context.Entity(someDepartment).State = EntityState.Modified;
context.SaveChanges();

那么相当于执行如下SQL

UPDATE department
SET Name = 'xxx',CreateTime = 'XXX', DepLeadID = 'XXX'
where Id = '1000'; -- the id of someDepartment

上面的这种方式,不会自动的检查字段是否变化,而是把所有的字段全部按照someDepartment中的值进行更新,即使没有任何变化。

而另外一种Attach的方式在更新上就会更加灵活。

context.Departments.Attach(someDepartment);
someDepartment.Name = 'XXX';
context.SaveChanges();

以上片段会执行下面语句:

UPDATE department
set Name = 'XXX'
where Id = '1000'

假如你想指定实体someDepartment中哪些字段是已经更改的状态,可以按如下代码:

context.Departments.Attach(someDepartment);
context.Entry(someDepartment).Property("Name").IsModified = true;
context.SaveChanges();

这样它也会像上面的SQL那样将Name字段更新。

Entity Framework使用EntityState和Attach来保存数据变化以及更新实体的个别字段的更多相关文章

  1. entity framework 6 我写了一个公用数据类

    public class BaseDAL { string strConn = ""; public BaseDAL(string connString) { strConn = ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  3. 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述

    微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...

  4. 《Entity Framework 6 Recipes》翻译系列(2) -----第一章 开始使用实体框架之使用介绍

    Visual Studio 我们在Windows平台上开发应用程序使用的工具主要是Visual Studio.这个集成开发环境已经演化了很多年,从一个简单的C++编辑器和编译器到一个高度集成.支持软件 ...

  5. Entity FrameWork对有外键关联的数据表的添加操作

    前天做了一个MVC Entity FrameWork项目,遇到有外键关联的数据编辑问题.当你编辑的时候,按照正常的逻辑,把每个字段的数据都对号入座了,然后点击保存按钮,本以为会顺理成章的编辑数据,但是 ...

  6. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 读取关系数据

    Reading related data¶ 9 of 9 people found this helpful The Contoso University sample web application ...

  7. Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include

    来自博客园开发团队开发前线最新消息: 在Entity Framework中,如果实体A关联了实体B,你想在加载实体A的同时加载实体B.通常做法是在LINQ查询中使用Include().但是,如果你在查 ...

  8. Entity Framework:三种开发模式实现数据访问

    原文地址 http://blog.csdn.net/syaguang2006/article/details/19606715 前言 Entity Framework支持Database First. ...

  9. Entity Framework(三):使用特性(数据注解)创建表结构

    一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...

随机推荐

  1. Linux学习,path,环境变量的配置

    方法一: 1.查看当前环境变量配置的所与信息 echo $PATH 注意: echo是输出的意思 加$表示它是一个变量 2.配置环境命令 PATH="$PATH":comdir 注 ...

  2. 《闲扯Redis四》List数据类型底层编码转换

    一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. ...

  3. 《MySQL实战45讲》学习笔记4——MySQL中InnoDB的索引

    索引是在存储引擎层实现的,且在 MySQL 不同存储引擎中的实现也不同,本篇文章介绍的是 MySQL 的 InnoDB 的索引. 下文将以这张表为例开展. # 创建一个主键为 id 的表,表中有字段 ...

  4. 数据结构和算法(Golang实现)(13)常见数据结构-可变长数组

    可变长数组 因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构.在Golang语言中,可变长数组被内置在语言里面:切片slice. sli ...

  5. PHP代码审计(初级篇)

    一.常见的PHP框架 1.zendframwork: (ZF)是Zend公司推出的一套PHP开发框架 功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现. ZF 的组件结构独一无二 ...

  6. go开发包下载,IDE工具下载,基础配置命令

    目录 go语言介绍 go开发包下载 命令介绍 配置 修改配置 golandIDE工具下载 编译并执行命令 命令 go语言介绍 # 1 诞生于 2009年,10年的时间,非常新的语言,天然支持并发,很新 ...

  7. SSH、SCP命令及使用说明

    SSH篇 1.ssh介绍 SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露 ...

  8. PHP函数:get_class()

    get_class()  -返回对象的类名 说明: get_class ([ object $object = NULL ] ) : string 参数: object:要测试的对象.如果在类里,此参 ...

  9. linux之cat 操作

    1.查看或创建 cat 1.txt #如果目录有这个文件则会打开查看,没有则会创建 2.压缩空白 cat 1.txt 我是第一行 我是第二 行 cat -bs 1.txt # 变成 cat 1.txt ...

  10. Python 【面试强化宝典】

    四大数据类型的常用方法 列表常用方法 #1. append 用于在列表末尾追加新的对象 a = [1,2,3] a.append(4) #the result : [1, 2, 3, 4] #2. c ...