35

当我遍历ObjectStateEntries我期望的[t]变量名时MY_ENTITY

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

但真实的我有

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

如何确定可以将当前条目转换为MY_ENTITY类型?

4

3 回答 3

57

您可以通过以下方式获取代理类型的原始实体类型

ObjectContext.GetObjectType(entity.GetType())

这是 的静态方法ObjectContext,因此您可以在DbContext环境中轻松使用。

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

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

这比

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

因为后一个片段将对象投射了两次。

于 2013-04-14T22:58:34.640 回答
10

您可以使用

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

或者

ObjectContext.GetObjectType(entity.GetType())

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

例如,如果您对 EF 实体模型使用TPT(按类型表)策略,则在内存对象上调用 BaseType() 将返回层次结构中的基类,这与ObjectContext.GetObjectType(..)

在此处输入图像描述

于 2015-07-04T08:53:13.933 回答
5

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

Type t = entry.Entity.GetType().BaseType;
于 2015-04-09T12:04:08.703 回答