Неожиданный результат 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
?
Ответы
Ответ 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;