• Entity Framework 实体状态


    从今天开始我们开始讲解EF中的实体状态和数据操作,这篇文章先讲解实体状态。
    我们通过前面的学习,知道EF通过上下位负责跟踪实体的状态,实体状态的位置是在命名空间 System.Dat.Entity 里的 EntityState,具体状态有如下5种:

    1. Detached
    2. Unchanged
    3. Added
    4. Deleted
    5. Modified

    下面我们分辨来讲解一下

    零、Detached

    有时候我们只需要实体显示,而不需要实体更新,为了提高性能,我们就就不需要EF上下文对实体进行跟踪,这个时候我们就用到了 Detached 状态。我们只需要在查询的时候使用 AsNoTracking() 来世的查询出来的对象是 Detached 状态。实例代码如下:

    var person = db.Person.AsNoTracking().Where(p=>p.Id==1).FirstOrDefault();
    

    注:因为 AsNoTracking 是DbQuery类的方法,因此要首先调用 AsNoTracking 方法。

    一、Unchanged

    在这个状态下实体被上下文追踪,但是数据库中的值没有发生任何改变。如果实体不存在于数据库,但是该实体要被上下文追踪,同时实体值未发生改变,这个时候就可以通过 Attach 进行附加追踪,然后将实体状态标记为 Unchanged 。 实例代码如下:

    using (var db = new EFDbContext())
    {
      var user =new User()
      {
        Name = "张三",
        Age = 12
      }
      db.User.Attach(user);
      db.Entry(user).State = EntityState.Unchanged;
      db.SaveChanges();
    }
    

    二、Added

    当进行新增操作时就会用到 Added 状态。标记为 Added 状态时,表明尸体上下文被追踪但是不存在于数据库中,当我们调用 SaveChanges 方法时数据将保存进数据库。如果要将实体状态标记为该状态,可以使用两种方法:

    1. 间接标记,通过 Add 方法调用,示例代码如下:
    using (var db = new EFDbContext())
    {
      var user = new User()
      {
        Name = "张三"
        Age = 12
      }
      db.User.Add(user);
      db.SaveChanges();
    }
    
    1. 显式标记,通过调用 Entry 方法,示例代码如下:
    using (var db = new EFDbContext())
    {
      var user = new User()
      {
        Name = "张三"
        Age = 12
      }
      db.Entry(user).State = EntityState.Added;
      db.SaveChanges();
    }
    

    三、Deleted

    如果需要将实体从数据库中删除,可以使用 Deleted 状态,当调用 SaveChanges 方法时数据将会从数据库中删除。和 Added 状态一样,删除实体可以使用两种方法:

    1. 通过调用 Remove 或者是 RemoveRange 方法,示例代码如下:
    using (var db = new EFDbContext())
    {
      var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
      db.User.Remove(user);
      db.SaveChanges();
    }
    

    注: Remove 用于删除单个实体, RemoveRange 用于删除多个实体。

    1. 显式标记,通过调用 Entry 方法,示例代码如下:
    using (var db = new EFDbContext())
    {
      var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
      db.Entry(user).State = EntityState.Deleted;
      db.SaveChanges();
    }
    

    四、Modified

    当我们修改数据时,需要用到 Modified 状态,当调用 SaveChanges 方法时数据将会修改数据库中的数据。在EF中修改数据,只有一种方法,通过调用 Entry 方法,示例代码如下:

    using (var db = new EFDbContext())
    {
      var user = db.User..Where(p => p.Id == 1).FirstOrDefault();
      db.Entry(user).State = EntityState.Modified;
      db.SaveChanges();
    }
    

    五、特别提示

    所有状态之间几乎都可以通过 Entry(T).State 的方式进行强制状态转换,因为状态改变都是依赖于 Id 的( Added 除外)。我们通过下图来了解一下上面五种状态的相互转换:
    elz3dg.png

  • 相关阅读:
    108.异常的传递
    107.捕获异常
    106.异常、模块(异常介绍)
    105.面向对象案例-烤红薯
    104.多态案例
    103.继承案例二
    102.继承案例一
    101.自定义玩家类
    100.自定义枪类
    python基础入门之十四 —— 文件操作
  • 原文地址:https://www.cnblogs.com/gangzhucoll/p/11260887.html
Copyright © 2020-2023  润新知