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(..)