2015-09-22 11 views
6

chcę wrócić pojedynczy element z mojego kontekście następującoKiedy zapytanie linq Entity Framework zwraca typy dynamicznego proxy, a kiedy nie?

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

Moje kontekst wygląda następująco:

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

Dlaczego jest to, że rodzaj mojej osoby zmiennej powyżej nie jest Person ale dynamiczny typ proxy, taki jak System.Data.Entity.DynamicProxies .Person_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6?

Jeśli używam Find, otrzymam typ jako Person. Chcę zwrócić rekord pierwszej listy, który został zamówiony przed datą ostatniej aktualizacji, i wydaje się najbardziej logicznym podejściem.

Zdaję sobie sprawę, że mogę wyłączyć dynamiczne generowanie proxy, ale nie sądzę, że jest to konieczne.

Załóżmy, że moje pytanie jest, które metody linq powodują, że obiekt zostanie zwrócony jako typ, jakiego można się spodziewać i który zwraca dynamiczny typ proxy?

+0

Zaktualizuj pytanie do "Które metody linq powodują, że obiekt jest zwracany jako typ, jakiego można się spodziewać i który zwraca dynamiczny typ proxy?" –

+0

czy to ważne? obiekt proxy nie ma nic specjalnego, żadne elementy nie są dodawane automatycznie, tylko zastępuje właściwości wirtualne zdefiniowane w twoim rzeczywistym typie obiektu, aby podpiąć pewne rzeczy. – Hopeless

+0

Używam automappera, aby następnie mapować do dto. Problem w tym, że mapowanie nie działa, gdy typ zwracany z kontekstu jest dynamicznym proxy. – obaylis

Odpowiedz

3

Jak widać w Entity Framework source code, nie jest ona związana z żadną metodą linq. Podczas tworzenia wyniku sprawdza, czy ProxyCreationEnabled ma wartość true, a następnie sprawdza, czy można utworzyć proxy dla typu, a następnie tworzy dla niego proxy. A oto przepis na sprawdzenie czy typ może 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); 
} 

Również z tego MSDN link: Zauważ, że EF nie stworzy proxy dla typów, gdzie nie ma nic do proxy zrobić. Oznacza to, że możesz także unikać serwerów proxy, stosując typy, które są zapieczętowane i/lub nie mają właściwości wirtualnych.

+0

Dzięki za informację. Dostałem dynamiczne proxy za pomocą FirstOrDefault, ale nie z Find in my Linq query. Używał tej samej klasy w obu przypadkach (z właściwościami wirtualnymi). – obaylis

Powiązane problemy