EF4 - 是否可以查看哪个ObjectContext正在跟踪特定实体?

时间:2011-10-20 20:47:24

标签: asp.net-mvc-2 entity-framework-4 automapper entities objectcontext

编辑:我想知道是否可以确定哪个ObjectContext正在跟踪哪些实体,这是一个明确的答案。是否有一个特定属性说“实体 x 属于此上下文?”

2 个答案:

答案 0 :(得分:2)

这不一定能回答你的问题,但对于开发人员理解他们实例化的上下文很重要,一种方法是实现“UnitOfWork”。对于每个工作单元,存在单个上下文并且用于该工作单元以执行手头的特定任务(例如,保存表单数据)。使用“UnitOfWork”模式,它接收依赖对象的Id(或Id的对象本身),检索对象,创建新对象,连接相关和新对象,然后保存更改。然后,对于调用工作单元的代码块,通过消息传递通知其他代码区域已经进行了更改。但由于您是无国籍人,因此消息传递约定不会直接适用。

第二个是,我几乎不使用AutoMapper或类似的,而是使用POCO和Code First。使用这个约定我现在使用我的POCO对象作为业务对象,这些对象由数据层(EF)填充,我的配置现在出现在DbContext(UnitOfWork)OnModelCreating方法中。删除整个映射过程会减少相当多的代码和复杂性。因此,我的建议是查看您的设计并确保有明确的切割模式,您可以使用它来管理/分离数据访问。

尽管如此,映射器非常适合Web服务。目的是最小化通过请求和响应处理发送和接收的数据量。例如,如果所有调用者想要的是名字和姓氏,则发送整个配置文件没有意义。

答案 1 :(得分:2)

如果您引用了所有可能的ObjectContext实例,则可以通过调用其.ObjectStateManager.TryGetObjectStateEntry(Object, out ObjectStateEntry)方法来确定给定实体实例所附加的实例 - 正确的实例将返回true。如果不这样做,则没有直接的公共API可以从实体实例获取到ObjectContext实例。如果实体具有关系并实现IEntityWithRelationships,则可以检索其RelationshipManager,要求它使用GetAllRelatedEnds获取任何相关的结尾(也称为“导航属性”),请相关的一端创建查询CreateSourceQuery,将其投放到ObjectQuery,最后检索.Context。如果您愿意使用反射来访问Entity Framework类的内部成员,则不必执行所有操作,但仍然可以从没有关系的实体实例获得的最佳效果是ObjectStateManager,而不是ObjectContext。更好的是,如果您需要从实体实例访问ObjectContext,您可以使用具有ObjectContext属性的自定义实体基类(具有自定义代码生成模板或其他),您可以填充和清除该属性在ObjectStateManagerChanged的事件处理程序中。