tag name c# entity-framework ef-code-first dbcontext objectstatemanager

c# - name - resultado GetType() inesperado para la entrada de entidad



summary param name c# (3)

Otra forma es acceder a la propiedad BaseType del tipo de proxy devuelto:

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

Mientras ObjectStateEntries través de ObjectStateEntries esperaba que [t] nombre de la variable sea MY_ENTITY

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

pero real tengo

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

¿Cómo puedo determinar si puedo convertir la entrada actual al tipo MY_ENTITY ?


Puede obtener el tipo de entidad original de un tipo de proxy por

ObjectContext.GetObjectType(entity.GetType())

Este es un método estático de ObjectContext , por lo que puede usarlo fácilmente en un entorno DbContext .

Si por alguna razón necesita la entidad real como su tipo original, puede usar el patrón

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

Esto es ligeramente más eficiente que

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

porque el último fragmento arroja el objeto dos veces.


Puedes usar

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

o

ObjectContext.GetObjectType(entity.GetType())

Pero la second forma es una mejor manera desde mi punto de vista. Si llama a la solicitud Type () dentro de un método Mapper, por ejemplo, el mapeador DTO (del objeto entidad a la clase DTO o de los objetos en memoria a la clase DTO), ObjectContext.GetObjectType(..) le otorgará siempre el resultado esperado contrario a ¿Qué será .GetType().BaseType

Por ejemplo, si usa una estrategia TPT (tabla por tipo) para el modelo de entidad EF, llamar a BaseType () en el objeto en memoria devolverá la clase base en jerarquía, a diferencia de lo que ObjectContext.GetObjectType(..)