28

虽然我通过ObjectStateEntries迭代我预计[t]变量名称将是MY_ENTITY意想不到的GetType()导致对实体进入

foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) 
{ 
    Type t = entry.Entity.GetType(); 
    ... 
} 

,但真正的我有

System.Data.Entity.DynamicProxies.MY_ENTITY_vgfg7s7wyd7c7vgvgv..... 

如何确定我可以施展电流输入MY_ENTITY类型?

+3

是否尝试过使用'is'关键字进行比较? – Silvermind

+0

是的,这个工程。 –

回答

43

您可以通过

ObjectContext.GetObjectType(entity.GetType()) 

得到一个代理类型的原始实体型这是一种static method of ObjectContext,所以你可以很容易地在一个DbContext环境中使用。

如果由于某种原因,你需要实际的实体作为其原始类型,你可以使用该模式

var entity = entry.Entity as MyEntity; 
if (entity != null) 
{ 
    ... 
} 

这比

if (entry.Entity is MyEntity) 
{ 
    var entity = (MyEntity)entry.Entity; 
    ... 
} 

会更有效,因为后者片断铸对象两次。

+0

需要知道原始类型的一个很好的理由是重写'Equals()',因为标准的'GetType()'返回代理,它与底层类型不一样。 – nicodemus13

+0

(应该是)这个方法是静态的这个显而易见的事实在我指出来之前完全失去了! – madannes

2

另一种方式是访问返回的代理类型的BaseType属性:

Type t = entry.Entity.GetType().BaseType; 
+6

我最初与这个答案一起,因为它看起来整洁(比需要ObjectContext更多的自我包含)比接受的答案。但是,根据场景,存在潜在的问题。如果你添加一个实体,它不是代理类型,而只是一个POCO类型。因此,调用它的BaseType返回'object'。如果您只使用代理类型,比如它只是处理从数据库检索到的实体,那么没有问题,但如果它可以是POCO或代理(例如,如果集合具有未保存的实体),则使用ObjectConext是唯一安全的选项,因为Enrico下面解释。 – Kate

5

您可以使用

Type t = entry.Entity.GetType().BaseType; 

ObjectContext.GetObjectType(entity.GetType()) 

second方式是从我的角度来看,更好的方式是。如果您在Mapper方法中调用Type()请求,例如DTO映射器(从实体对象到DTO类或从内存对象到DTO类),ObjectContext.GetObjectType(..)将授予您总是预期结果与.GetType().BaseType

相反

例如,如果您使用的是TPT (Table per Type)策略EF实体模型,调用BASETYPE()在内存中的对象将在层次结构相反返回基类你会ObjectContext.GetObjectType(..)

enter image description here

相关问题