资讯专栏INFORMATION COLUMN

Entity Framework 实体状态

Joyven / 1608人阅读

摘要:从今天开始我们开始讲解中的实体状态和数据操作,这篇文章先讲解实体状态。实例代码如下张三二当进行新增操作时就会用到状态。标记为状态时,表明尸体上下文被追踪但是不存在于数据库中,当我们调用方法时数据将保存进数据库。

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

Detached

Unchanged

Added

Deleted

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 方法时数据将保存进数据库。如果要将实体状态标记为该状态,可以使用两种方法:

间接标记,通过 Add 方法调用,示例代码如下:

using (var db = new EFDbContext())
{
  var user = new User()
  {
    Name = "张三"
    Age = 12
  }
  db.User.Add(user);
  db.SaveChanges();
}

显式标记,通过调用 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 状态一样,删除实体可以使用两种方法:

通过调用 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 用于删除多个实体。

显式标记,通过调用 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 除外)。我们通过下图来了解一下上面五种状态的相互转换:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/61667.html

相关文章

  • Entity Framework 实体状态

    摘要:从今天开始我们开始讲解中的实体状态和数据操作,这篇文章先讲解实体状态。实例代码如下张三二当进行新增操作时就会用到状态。标记为状态时,表明尸体上下文被追踪但是不存在于数据库中,当我们调用方法时数据将保存进数据库。 从今天开始我们开始讲解EF中的实体状态和数据操作,这篇文章先讲解实体状态。我们通过前面的学习,知道EF通过上下位负责跟踪实体的状态,实体状态的位置是在命名空间 System....

    CollinPeng 评论0 收藏0
  • [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体

    摘要:本文我们来学习一下在中使用删除多对多关系的实体是如何来实现的。我们将以一个具体的控制台小实例来了解和学习整个实现多对多关系的实体删除的操作过程。执行以上命令,我们这时再打开数据库管理工具。 本文我们来学习一下在Entity Framework中使用Context删除多对多关系的实体是如何来实现的。我们将以一个具体的控制台小实例来了解和学习整个实现Entity Framework 多对多...

    baishancloud 评论0 收藏0
  • Entity Framework简介

    摘要:零什么是简称,是的实体框架简称,可以在等数据库上使用。一领域建模方式有三种领域建模方式和可以通过类来描述模型,然后通过类来创建数据库,这种类简称为。中的是指公共语言运行时,中的一个简单对象。 零、什么是Entity Framework Entity Framework (简称EF),是.NET的 Object/Relational Mapping 实体框架(简称ORM),可以在 SQL...

    forsigner 评论0 收藏0
  • Entity Framework简介

    摘要:零什么是简称,是的实体框架简称,可以在等数据库上使用。一领域建模方式有三种领域建模方式和可以通过类来描述模型,然后通过类来创建数据库,这种类简称为。中的是指公共语言运行时,中的一个简单对象。 零、什么是Entity Framework Entity Framework (简称EF),是.NET的 Object/Relational Mapping 实体框架(简称ORM),可以在 SQL...

    Freeman 评论0 收藏0
  • .NET(C#)有哪些主流的ORM框架,FreeSql,SqlSugar,Dapper,EF还是..

    摘要:支持多种数据库,。推荐等级原于年发布,年正式开源。推荐等级以上是笔者收集整理的部分目前中流行的框架。 前言 在以前的一篇文章中,为大家分享了《什么是ORM?为什么用ORM?浅析ORM的使用及利弊》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,FreeSql,SqlSugar,Dapper,Entity Framework(EF)还是ServiceStack.OrmLit...

    Wuv1Up 评论0 收藏0

发表评论

0条评论

Joyven

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<