打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
谈ENTITYFRAMEWORK数据更新之技巧

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操作就行了,代码如下:

 1 public void Modify(Customer entity,CustomerAddress address) 2         { 3             context.Customer.Add(entity); 4  5             //修改Customer 6             context.Entry(entity).State = EntityState.Modified; 7  8             //新增CustomerAddress 9             if (......)10             {11                 entity.CustomerAdresses.Add(address);12             }13             14             //删除CustomerAddress15             if (.......)16             {17                 context.Entry(address).State = EntityState.Deleted;18             }19             context.SaveChanges();20         }

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

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

 1        /// <summary> 2         /// 实体部分更新 3       /// </summary> 4         /// <param name="originalEmployee">需修改的实体</param> 5         /// <param name="newEmployee">新的实体</param> 6  public void 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操作将修改该实体。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#综合揭秘——Entity Framework 并发处理详解
Entity Framework Add/Attach and Entity States
ORM框架EF(一)增删改查
关于EF框架EntityState的几种状态
EntityFramework优缺点
关于Entity Framework 学习中的POCO
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服