Подтвердить что ты не робот

Неожиданный результат GetType() для записи объекта

Пока я повторяю через 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?

4b9b3361

Ответ 1

Вы можете получить исходный тип сущности типа прокси на

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;
    ...
}

потому что последний фрагмент бросает объект дважды.

Ответ 2

Вы можете использовать

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

или

ObjectContext.GetObjectType(entity.GetType())

Но способ second является лучше с моей точки зрения. Если вы вызываете запрос Type() внутри метода Mapper, например, DTO mapper (от объекта сущности до класса DTO или из объектов в памяти в класс DTO), ObjectContext.GetObjectType(..) предоставит вам всегда ожидаемый результат вопреки тому, что будет .GetType().BaseType

Например, если вы используете стратегию TPT (таблица для каждого типа) для модели Entity Entity, вызовите BaseType() для объекта in-memory вернет базовый класс в иерархию вопреки тому, что будет ObjectContext.GetObjectType(..)

enter image description here

Ответ 3

Другой способ - получить доступ к свойству BaseType возвращаемого типа прокси:

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