2015-09-22 12 views
6

Voglio tornare un singolo articolo dal mio contesto come segueQuando una query linq di Entity Framework restituisce i tipi di proxy dinamici e quando no?

using (var context = new MyContext()) 
{ 
    var person = context.People.OrderByDescending(x => x.LastUpdatedDate).FirstOrDefault(); 
} 

mio contesto si presenta come:

public DbSet<Person> People { get; set; } 

Perché è che il tipo di mia variabile persona al di sopra non è Person ma la dinamica tipo di proxy come System.Data.Entity.DynamicProxies .Person_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6?

Se utilizzo Find, ottengo il tipo Person. Voglio restituire il primo record come ordinato in base alla data dell'ultimo aggiornamento e OrderByDescending/FirstOrDefault sembrava l'approccio più logico.

Mi rendo conto che potrei disattivare la generazione di proxy dinamico ma non penso che sia necessario.

Supponiamo che la mia domanda sia quale metodo linq fa restituire l'oggetto come il tipo che ci si potrebbe aspettare e quale restituisce il tipo di proxy dinamico?

+0

Aggiorna la tua domanda a "Quali metodi linq causano la restituzione dell'oggetto come il tipo che ci si potrebbe aspettare e quali restituiscono il tipo di proxy dinamico?" –

+0

è importante saperlo? l'oggetto proxy non ha nulla di speciale, nessun membro aggiunto automaticamente, sostituisce semplicemente le proprietà virtuali definite nel tipo di entità reale per collegare alcune cose. – Hopeless

+0

Sto usando automapper per poi mappare a un dto. Il problema che sto avendo è che la mappatura non funziona quando il tipo restituito dal contesto è il proxy dinamico. – obaylis

risposta

3

Come si vede in Entity Framework source code, non è correlato a nessun metodo linq. Quando crea il risultato, controlla se lo ProxyCreationEnabled è vero, quindi controlla che se un proxy può essere creato per tipo, quindi crea un proxy per esso. E qui è la regola per controllare se il tipo di lattina di proxy:

private static bool CanProxyType(EntityType ospaceEntityType) 
{ 
    TypeAttributes access = ospaceEntityType.ClrType.Attributes & TypeAttributes.VisibilityMask; 

    ConstructorInfo ctor = ospaceEntityType.ClrType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, Type.EmptyTypes, null); 
    bool accessableCtor = ctor != null && (((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public) || 
              ((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Family) || 
              ((ctor.Attributes & MethodAttributes.MemberAccessMask) == MethodAttributes.FamORAssem)); 

    return (!(ospaceEntityType.Abstract || 
       ospaceEntityType.ClrType.IsSealed || 
       typeof(IEntityWithRelationships).IsAssignableFrom(ospaceEntityType.ClrType) || 
       !accessableCtor) && 
       access == TypeAttributes.Public); 
} 

Anche da questo MSDN link: Si noti che l'EF non creerà proxy per i tipi dove non c'è nulla per il proxy di fare. Ciò significa che puoi anche evitare i proxy avendo tipi sigillati e/o privi di proprietà virtuali.

+0

Grazie per l'informazione. Ho ottenuto proxy dinamici utilizzando FirstOrDefault ma non con Trova nella mia query Linq. Stava usando la stessa classe in entrambi i casi (con proprietà virtuali). – obaylis

Problemi correlati