我自己的一生

是你的,是我的,到底是谁的?

导航

Entity Framework 编程

 作者:Julia Lerman

译者:Abbott zhao

第五章 修改实体和保存变化

5.1如何使用ObjectContext来管理实体

         在第三章和第四章中,你已经使用了ObjectContext,从ObjectContext中继承的ProgrammingEFDB1Entities类,创建查询。你也使用了这些查询返回的对象做了工作。无论它们是实体,或者匿名类型,或者DbDataRecord里面的一个对象,这些对象交互的本质是通过对象和暴露给控制台窗体的显示的属性(Property)的迭代。

    这些对象是被内部过程(称为“对象具体化”)所创建,把获取的数据构建为适合你的对象。查询出来的数据,可以是实体对象(EntityObject)、匿名(anonymous)类型或者DbDataRecords。对于具体化的实体对象,默认下,ObjectContext在后边会额外产生一个ObjectStateEntry对象,叫做ObjectStateEntry。使用ObjectStateEntry对象保存与他相关实体的改变踪迹。如果你使用同一个上下文环境再次执行一个查询,为任何一个新增加的实体创建ObjectStateEntry对象,上下文环境能很好地管理好这些内容。只要在内存中维护这些实体,上下文环境就能保存这些变化的踪迹。

    ObjectContext仅对实体进行跟踪。不跟踪匿名实体和来源于DbDataRecord的对象。

    注意

你将会在第9章中学习到更多的有关对象具体化、ObjectStateEntry、变化跟踪及其它的细节。

 

5.1.1 记忆原始值和保存变化踪迹

ObjectStateEntry捕获一个实体值的快照,作为第一次创建,存储为原始值。当前值和原始值二者隔离设置。ObjectStateEntry有一个EntityState属性(Property)反应实体状态,这个状态有:Unchanged(未变化), Modified(已修改), Added(新增), Deleted(已删除)。只要用户修改了实体,ObjectContext刷新ObjectStateEntry的当前值和EntityState的状态。等你学习了更多的实体框架知识,你会发现更多定位和检查ObjectStateEntry的明细。

 

注意

对象自身也有一个EntityState属性(Property)。只有对象被上下文环境所管理,EntityState总是要和ObjectStateEntryEntityState匹配。如果不被上下文环境管理,它的状态是被分离的(Detached)。

 

实体有两个不同的属性类型:标量属性(Scalar Property)和导航属性(Navigation Property)。ObjectStateEntry仅对它相关的标量值进行跟踪。导航的跟踪使用的不同的方法,这个方法超出了高层视图的范围,但,你可以在第9章和第15章学习更多的关系和关联的知识。

当标量属性发生改变时--例如:Contact.LastName—LastName的值将设置在contactObjectStateEntry中的当前值。如果ObjectStateEntry.EntityState在修改时是Unchanged,它的值将会被修改为Modified