猿教程 Logo

实体生命周期

在我们对实体执行CRUD操作(创建、读取、更新、删除)之前,理解实体的生命周期以及它是如何被EntityFramework管理是非常重要的。

在其生存期期间,一个实体只有一个状态。在了解如何检索状态之前,先看看什么是实体状态。实体状态就是声明为以下值的System.Data.EntityState类型的枚举:

Added——实体标记为added。

Deleted——实体标记为deleted。

Modified——实体已经被修改。

Unchanged——实体还没有被修改。

Detached——实体不能被追踪。

如果在上下文外部创建一个实体,它的状态为Detached,因为上下文不能追踪它。

如果将一个实体附加到上下文,它的状态就变为Unchanged。如果从数据库中检索一个实体,然后从上下文中移除,实体的状态为Detached。如果检索一个实体,释放上下文,然后创建一个新的上下文,给它添加一个实体,这个实体的状态则为Added。这些例子说明,状态是实体和对它持有引用的上下文间的关系。

状态不仅仅表示上下文中的实体状态,还表示数据如何持久化到数据库。每一个状态,都有一个对应的SQL命令。

Added状态的实体使用INSERT命令在映射的表中创建一个新行进行持久化。Modified实体在表中已经有了对应的行,所以使用UPDATE命令持久化。Deleted状态的实体在表中有对应的行,但是它触发DELETE而不是UPDATE。

Detached和Unchanged状态对数据库没有影响:detached实体不能被上下文追踪,所以不用持久化,而unchanged实体没有修改的东西需要持久化。

在其生存期期间,实体可以改变其状态。

正如你在上面的图中所看到的,上下文增加的新实体有一个Added状态, 所以上下文中执行insert命令到数据库。 以同样的方式,当你使用L2E查询检索现有的实体,它将改变状态,这是因为你刚刚检索一个实体,还没有执行任何操作。 当你修改现有的实体的属性,该实体的状态该变为Modified状态,进而将在SaveChanges上执行update命令。 从上下文中将实体删除后该实体的状态将改为删除状态,进而将执行删除命令到数据库。

所以,通过这种方式,对实体的操作会导致实体状态的变化,Context根据实体状态的变化生成和执行对应的SQL语句。


Entity Framework实体状态说明


DETACHED状态

当一个实体处于Detached状态,它没有绑定到上下文(context),所以它的状态是不能被追踪的。它可以释放,修改以及和其他类组合或者其他任何你可能需要的方式使用。因为它没有上下文追踪它,它对EF没有意义。

由于上下文不能追踪你代码中任何对象的创建,因此,Detached是新创建实体的默认状态。即使你在上下文的using块中实例化实体也是如此。当追踪被禁用时,Detached还是从数据库中检索的实体的状态。

UNCHANGED状态

当实体是Unchanged状态,它被绑定到上下文,但是它还没有被修改。默认情况下,从数据库中检索的实体是这种状态。

当实体附加到(使用Attach方法)上下文时,它同样是Unchanged状态。上下文不能追踪它不引用的对象的变化,所以当它们附加到上下文,它们是Unchanged状态。

ADDED状态

当实体处于Added状态,你有很少的选择。实际上,你只能使用Detach方法将它从上下文中分离。

当然,即使你修改了一些属性,状态依然保持为Added,因为转换到Modified,Unchanged或者Deleted没有意义——它是一个新实体并且在数据库中没有对应的行。这是处在这些状态的前提条件。

MODIFIED状态

当实体是Modified时,这意味着它处在Unchanged状态,然后改变了一些属性。

一个实体进入Modified状态后,它可以转换到Detached或者Deleted状态,但是即使手动重置初始值也不能使它回滚到Unchanged状态(除非从上下文分离再附加到上下文)。它也不能变成Added状态(除非从上下文分离再添加一个实体到上下文,因为在数据库中已经存在这个ID的行,当持久化它时,就会得到一个运行时异常)。

DELETED状态

实体进入Deleted状态因为它处于Unchanged或者Modified状态,然后使用了DeleteObject。这是最严格的状态,因为除了转换成Detached状态,从这种状态转换成任何其他的状态都是没有意义的。



版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/entity-lifecycle.html