您好,西南地方旅游网欢迎您的到来!

您所在的位置:首页 > 地名 > 中国 > 西北地区 > 甘肃 > 天水 >

谈EntityFramework数据更新之技巧

更新时间:2017-10-22 19:24:46www.2ndflr.com云南旅行社169

EntityFramework是一个很不错的ORM框架,一直都在使用。今天想跟大家分享以下EntityFramework数据更新方面的几个技巧:
 1:如何new一个新实体去更新记录,而不是从数据库中查询一条记录来更新。
 2:如何在更新实体的同时,对导航属性的实体进行一系列的操作。
 3:如何用最简单的代码实现实体的部分更新。

new一个新实体去更新记录

EntityFramework有一个特点,你无须查询出一个记录,而是new一个新实体,然后对其进行删除或更新操作,只须提供实体的ID即可,如果ID不存在将会抛出异常。这样有助于提高性能,毕竟减少了一次数据库访问。要实现用一个新实体去更新记录,你得让EF的Change Tracker跟踪该实体,让它认为该实体就是从数据库中取出来的,只要让改该实体处于修改状态就行了,代码如下:

1 context.Entry<TEntity>(entity).State = EntityState.Modified; 2 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操作就行了,代码如下:

Modify(Customer entity,CustomerAddress address) 2 { 3 context.Customer.Add(entity); context.Entry(entity).State = EntityState.Modified; (......) 10 { 11 entity.CustomerAdresses.Add(address); 12 } (.......) 16 { 17 context.Entry(address).State = EntityState.Deleted; 18 } 19 context.SaveChanges(); 20 }

View Code

如果注释掉context.Customer.Add(entity)这行代码,将会抛出异常,这个是值得注意的地方。

3 实现实体的部分更新
以前好像在园子里有朋友讲过Entityframework实体部分更新的问题,就是用反射去遍历实体的属性,把需要修改的实体属性状态设置为Modified,这样也可以达到目的,但是这样写的代码有点多,而且对Entityframework的特性没有充分的利用,其实很简单两行代码就搞定:

实体部分更新 Modify(Employee originalEmployee, Employee newEmployee) 7 { 8 context.Entry(originalEmployee).CurrentValues.SetValues(newEmployee); 9 context.SaveChanges(); 10 }

关键是第一行代码,意思就是把原来实体的值设置为新实体的值,大家可以查看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数据更新之技巧:https://www.2ndflr.com/dm/tianshui/931301.html

相关问答

更多相关天水属于哪,请关注云南地方旅游网:https://www.2ndflr.com

周边城市地名

 秦城区   北道区   清水县   秦安县   甘谷县   武山县   张家川县   麦积区  

推荐地名

 博湖县   阿克苏地区   阿克苏   温宿县   库车县   沙雅县   新和县   拜城县   乌什县   阿瓦提县   柯坪县   克孜勒苏州   阿图什   阿克陶县   阿合奇县   乌恰县   喀什地区   喀什   伽师县   巴楚县   塔什库尔干塔吉克县   疏附县   疏勒县   英吉沙县   泽普县