【译文】Entity Framework 编程--第五章 修改实体和保存变化(1)
Posted on 2009-07-15 14:36 Abbott zhao 阅读(2277) 评论(3) 编辑 收藏 举报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总是要和ObjectStateEntry的EntityState匹配。如果不被上下文环境管理,它的状态是被分离的(Detached)。
实体有两个不同的属性类型:标量属性(Scalar Property)和导航属性(Navigation Property)。ObjectStateEntry仅对它相关的标量值进行跟踪。导航的跟踪使用的不同的方法,这个方法超出了高层视图的范围,但,你可以在第9章和第15章学习更多的关系和关联的知识。
当标量属性发生改变时--例如:Contact.LastName—LastName的值将设置在contact的ObjectStateEntry中的当前值。如果ObjectStateEntry.EntityState在修改时是Unchanged,它的值将会被修改为Modified。