28

Mentre scorrendo ObjectStateEntries mi aspettavo [t] nome di variabile sarà MY_ENTITYGetType inaspettato() comporteranno per l'ingresso entità

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

ma reale ho

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

Come è possibile determinare che posso lanciare corrente voce al tipo MY_ENTITY?

+3

hai provato a confrontare usando la parola chiave 'is'? – Silvermind

+0

sì, funziona. –

risposta

43

è possibile ottenere il tipo di entità originale di un tipo di proxy da

ObjectContext.GetObjectType(entity.GetType()) 

Questa è una static method of ObjectContext, in modo da poter facilmente utilizzare in in un ambiente DbContext.

Se per qualche motivo è necessario l'entità reale come il suo tipo originale è possibile utilizzare il modello

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

Questo è leggermente più efficiente di

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

perché quest'ultimo frammento di lancia l'oggetto due volte .

+0

Un buon motivo per cui è necessario conoscere il tipo originale è quello di sovrascrivere 'Equals()', poiché lo standard 'GetType()' restituisce il proxy, che non è lo stesso del tipo sottostante. – nicodemus13

+0

Il (ovvio) stato ovvio che il metodo è statico è stato completamente perso su di me fino a quando non l'hai fatto notare! – madannes

2

Un altro modo è quello di accedere alla proprietà BaseType del tipo di proxy restituito:

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

Inizialmente sono andato con questa risposta in quanto sembra più ordinata (più autonoma di quella che richiede ObjectContext in giro) rispetto alla risposta accettata. Tuttavia, c'è un potenziale problema a seconda dello scenario. Se si aggiunge un'entità, non è ancora un tipo proxy, ma solo un tipo POCO. Pertanto, chiamando BaseType su di esso ritorna 'oggetto'.Se lavori solo con i tipi di proxy, ad esempio se si tratta solo di entità recuperate dal DB, nessun problema, ma se potrebbe essere POCO o proxy, ad esempio se la raccolta include entità non salvate, utilizzare ObjectConext è l'unica opzione sicura come Enrico spiega sotto. – Kate

5

È possibile utilizzare

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

o

ObjectContext.GetObjectType(entity.GetType()) 

Ma il modo second è un meglio dal modo dal mio punto di vista. Se si richiama la richiesta Type() all'interno di un metodo Mapper, ad esempio il mapper DTO (dall'oggetto entità alla classe DTO o dagli oggetti in memoria alla classe DTO), ObjectContext.GetObjectType(..) garantirà sempre il risultato previsto contrariamente a quanto sarà .GetType().BaseType

ad esempio, se si utilizza una strategia TPT (Table per Type) per EF modello entità, chiamata BaseType() su un oggetto in memoria restituirà la classe base in contrasto con la gerarchia a quello che ObjectContext.GetObjectType(..)

enter image description here