ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Entity Framework 实体状态

2021-12-10 16:31:06  阅读:177  来源: 互联网

标签:实体 db Entity Framework user var new SaveChanges User


实体状态的位置是在命名空间 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();
}
复制代码

标签:实体,db,Entity,Framework,user,var,new,SaveChanges,User
来源: https://www.cnblogs.com/jck980/p/15672495.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有