在Entity Framework 6中自定义实体实现

时间:2013-11-14 10:01:48

标签: c# entity-framework dbcontext

有没有办法实现您自己的类的实例,该实例派生自模型中指定的实体类型?假设我的模型中有一个给定实体的“ClassName”属性,每当EF实现实体的一个实例时,我想创建一个指定ClassName的实例(当然这是实体的子类)

我知道ObjectContext上有ObjectMaterialized事件,但此时已经创建了实体。

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.ObjectMaterialized += OnObjectMaterialized;

我需要一个钩子才能自定义对象创建。你可能会问我为什么要这样做呢。我有一个不断变化的大型对象模型,因此我无法在EDMX中定义所有类。我存储在数据库中的属性可以抽象为对象模型层次结构顶部的几个类。我打算为那些使用table-per-type继承的人创建实体。但是,如果我在使用EF时可以直接检索特定的对象实例,那将非常棒。

谢谢!

1 个答案:

答案 0 :(得分:1)

我想创建自定义代理并深入调试实体框架。我找到了翻译器类,它负责通过反射创建实体。该类的名称空间是 System.Data.Entity.Core.Common.Internal.Materialization

创建entites的方法是私有方法 Emit_ConstructEntity 。实体类型是一个参数,由私有方法 LookupObjectMapping 基于EdmType对象(我首先使用模型)创建。

如果要更改创建的类,则必须创建自定义MetaDataWorkspace。工作区负责选择EdmType。也许尝试自己调试方法,看看如何使用MetaDataWorkspace来识别CLR类型。