谈EntityFramework数据更新之技巧
EntityFramework是一个很不错的ORM框架,一直都在使用。今天想跟大家分享以下EntityFramework数据更新方面的几个技巧:
1:如何new一个新实体去更新记录,而不是从数据库中查询一条记录来更新。
2:如何在更新实体的同时,对导航属性的实体进行一系列的操作。
3:如何用最简单的代码实现实体的部分更新。
1 new一个新实体去更新记录
EntityFramework有一个特点,你无须查询出一个记录,而是new一个新实体,然后对其进行删除或更新操作,只须提供实体的ID即可,如果ID不存在将会抛出异常。这样有助于提高性能,毕竟减少了一次数据库访问。要实现用一个新实体去更新记录,你得让EF的Change Tracker跟踪该实体,让它认为该实体就是从数据库中取出来的,只要让改该实体处于修改状态就行了,代码如下:
context.Entry<TEntity>(entity).State = EntityState.Modified;
context.SaveChanges();
2 更新实体时操作导航属性
用一个例子来说明在更新实体同时如何对导航属性进行操作吧。假设有两个类型
public class Customer
{
public string ID { get; set; }
public string Name { get; set; }
public IList<CustomerAddress> CustomerAddresses { get; set; }
}
public class CustomerAddress
{
public string City { get; set; }
public string ZipCode { get; set; }
public string CustomerId { get; set; }
public Customer Customer { get; set; }
}
那如何在更新Customer的同时Add一个CustomerAddress并且Delete一个CustomerAddress呢?关键一点就是要让EntityFramework的Change Tracker知道有CustomerAddress的存在,只需对Customer增加一个Add操作就行了,代码如下:
public void Modify(Customer entity,CustomerAddress address)
{
context.Customer.Add(entity); //修改Customer
context.Entry(entity).State = EntityState.Modified; //新增CustomerAddress
if (......)
{
entity.CustomerAdresses.Add(address);
} //删除CustomerAddress
if (.......)
{
context.Entry(address).State = EntityState.Deleted;
}
context.SaveChanges();
}
如果注释掉context.Customer.Add(entity)这行代码,将会抛出异常,这个是值得注意的地方。
3 实现实体的部分更新
以前好像在园子里有朋友讲过Entityframework实体部分更新的问题,就是用反射去遍历实体的属性,把需要修改的实体属性状态设置为Modified,这样也可以达到目的,但是这样写的代码有点多,而且对Entityframework的特性没有充分的利用,其实很简单两行代码就搞定:
/// <summary>
/// 实体部分更新
/// </summary>
/// <param name="originalEmployee">需修改的实体</param>
/// <param name="newEmployee">新的实体</param>
public void Modify(Employee originalEmployee, Employee newEmployee)
{
context.Entry(originalEmployee).CurrentValues.SetValues(newEmployee);
context.SaveChanges();
}
关键是第一行代码,意思就是把原来实体的值设置为新实体的值,大家可以查看CurrentValues.SetValues()这个方法的源代码,就能明白其中的道理。在执行查询的时候大家 可以打开SQLServer Profiler查看是否真的是部分更新了。如果该实体是一个新实体,该如何更新呢?还是老办法让EntityFramework知道它的存在,把它的状态设置为UnChanged即可,综合两种情况,合并的代码如下:
public void Modify(Employee originalEmployee, Employee newEmployee)
{
if (context.Entry(originalEmployee).State != EntityState.Unchanged)
context.Entry(originalEmployee).State = EntityState.Unchanged;
context.Entry(originalEmployee).CurrentValues.SetValues(newEmployee);
context.SaveChanges();
}
其实今天讲的都是new一新实体去更新数据库,关键是让EF 的Change Tracker跟踪新实体这样才能达到修改的目的,而这一切都是设置EntityState才行。
顺便提一下EntityState,它是一枚举类型,有Detached,Unchanged,Added,Deleted,Modified五个值分别代表:实体没被跟踪,啥操作对它无效;实体存在于数据库但还没被修改;实体被跟踪但不存在于数据库,实体存在于数据库并且标记为删除,SaveChanges操作将删除该实体;实体存在于数据库并且标记为修改,SaveChanges操作将修改该实体。
谈EntityFramework数据更新之技巧的更多相关文章
- 老司机浅谈linux系统学习技巧
Linux起源于20世纪70年代,是一种优秀的操作系统系统.初次接触到linux这个系统是在大学期间,这样才发现除了windows外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它 ...
- 浅谈EntityFramework框架的使用
第一步,建立一个类库,并且安装好EntityFramework框架还有CodingFirstUsingFluentApi安装包 第二步 : 第三步:配置好你的数据库连接信息,还有你需要操作的数据库,在 ...
- 浅谈flex布局中小技巧
最近有个面试,面试官问到,在一个横向布局上,假设有三个div,每个宽度为定宽apx,如果想使两侧宽度为x,中间div间间隔为2x.x可以自适应.如下图: 怎么做很简单,两行代码就搞定: justi ...
- 【开源】OSharp框架解说系列(5.2):EntityFramework数据层实现
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...
- MVC实用构架设计(三)——EF-Code First(6):数据更新最佳实践
前言 最近在整理EntityFramework数据更新的代码,颇有体会,觉得有分享的价值,于是记录下来,让需要的人少走些弯路也是好的. 为方便起见,先创建一个控制台工程,使用using(var db ...
- CSS技巧 (3)
关于CSS技巧的一些题目 题目列表 所有答案点击题目链接 1.下面这个左边竖条图形,只使用一个标签,可以有多少种实现方式: 2.类似下面这样的条纹边框,只使用一个标签,可以有多少种实现方式 -- 从条 ...
- iOS 页面流畅技巧(1)
一.屏幕显示图像原理 首先明确两个概念:水平同步信号.垂直同步信号. CRT 的电子枪按照上图中的方式,从上到下一行一行的扫描,扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次的扫描. ...
- Offer是否具有法律效力?
版权声明:原创作品,同意转载,转载时请务必以超链接形式标明文章原始出版.作者信息和本声明.否则将追究法律责任.本文地址: http://blog.csdn.net/jobchanceleo/archi ...
- 史上最全的CSP2019复习指南
CSP2019复习指南 知识点(大纲)内容参考于本人博客: 近22年NOIP考点一览 算法 基本算法: 模拟.暴力枚举.排序.贪心.递归.递推.贪心.二分.位运算 这些算法不再在此加以赘述,如有考前还 ...
随机推荐
- 在MFC中添加用户自定义消息
1.定义一个宏 (用户自定义消息从WM_USER开始) #define WM_XXXXX WM_USER+数值 2.声明一个函数并实现 afx_msg LRESULT OnXXXXX( WPARAM ...
- 不用synchronized块的话如何实现一个原子的i++?
上周被问到这个问题,没想出来,后来提示说concurrent包里的原子类.回来学习一下. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic ...
- hadooop 配置多网卡 提供跨网段服务
http://hortonworks.com/blog/multihoming-on-hadoop-yarn-clusters/ https://hadoop.apache.org/docs/r2.6 ...
- [转载]两个半小时学会Perl
Learn Perl in about 2 hours 30 minutes By Sam Hughes Perl is a dynamic, dynamically-typed, high-leve ...
- Golang gRPC 示例
1.安装gRPC runtime go get google.golang.org/grpc 为了自动生成Golang的gRPC代码,需要安装protocal buffers compiler以及对应 ...
- UESTC 914 方老师的分身I Dijkstra
题意:求有向图的往返最短路的最长长度. 分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来.考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果. 所以 ...
- HDU 4121 Xiangqi --模拟
题意: 给一个象棋局势,问黑棋是否死棋了,黑棋只有一个将,红棋可能有2~7个棋,分别可能是车,马,炮以及帅. 解法: 开始写法是对每个棋子,都处理处他能吃的地方,赋为-1,然后判断将能不能走到非-1的 ...
- Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常
消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...
- Flash Builder 找不到所需的 Adobe Flash Player
经测试该方法可用! http://bbs.9ria.com/thread-108472-1-1.html 最近重装了系统,flash开发工具也由flex换成了flash builder.调试时就出现了 ...
- android:ToolBar详解(手把手教程)
今年(2014) 的 google i/o 发表令多数人为之一亮的 material design,而 google 也从「google i/o 2014」 开始,大家也陆陆续续地看到其更新的 and ...