2011-07-14 13 views
6

Powiel możliwe:
EF4 Cast DynamicProxies to underlying objectC# Clone System.Data.Entity.DynamicProxies do rzeczywistej (bez proxy) klasy?

Próbuję dowiedzieć się, w jaki sposób sklonować i konwertować System.Data.Entity.DynamicProxies na to rzeczywista klasa. Np:

System.Data.Entity.DynamicProxies.Currency_F4008E27DE_etc is the proxy class 
MyApp.Entities.Currency is the real class 

Wszystkie zajęcia w MyApp.Entities dziedziczą BaseEntity, więc starałem się wykonać konwersję tam:

public abstract partial class BaseEntity 
{ 
    public T ShallowCopy<T>() where T : BaseEntity 
    { 
     return this.MemberwiseClone() as T; 
    } 
    // other BaseEntity properties not relevent here 
} 

A potem przekształcenie DynamicProxies do realnego Klasa:

// this returns a DynamicProxies class 
Currency currency = LookupDefaultCurrency(); 
// this one needs to return a Entities.Currency class 
// (but currently returns a DynamicProxies class too 
Currency pocoCurrency = (Currency)currency.ShallowCopy<Currency>(); 
HttpRuntime.Cache[key] = pocoCurrency; 

Powodem tego jest to, że chcę usunąć wszystkie śledzenie Entity Framework i etc z tego obiektu i po prostu przechowywać jego proste (POCO) właściwości w pamięci podręcznej. I będę musiał to zrobić dla wszystkich 100 klas Entity, więc musi to być generyczne - bez ręcznego mówienia object1.foo = object2.foo dla każdej właściwości.

+0

Dlaczego nie wyłączyłeś generowania proxy, o co prosiłeś w poprzednim pytaniu? –

+0

Okazało się, że to nie jest to, czego potrzebowałem. Potrzebuję ich, aby byli pełnomocnikami (z całym śledzeniem itp.) Przez większość czasu. Ale podczas buforowania dla późniejszego użycia tylko do odczytu, musi to być obiekt bez proxy, patrz http://stackoverflow.com/questions/6688772/c-entity-framework-using-only-one-objectcontext-per-httpcontext –

+0

Możesz włączyć wyłączyć tworzenie proxy selektywnie dla niektórych instancji kontekstowych lub nawet zapytań, więc Imho powinieneś mieć się dobrze z wyłączaniem serwerów proxy tylko do ładowania twoich walut. –

Odpowiedz

1

Może pomocna jest this article. Omówiono kilka metod klonowania danych. Nie jestem pewien, czy te metody mogą zostać użyte do przekonwertowania obiektu typu A na obiekt typu B. Ale zdecydowanie warto spróbować.

Byłbym bardzo zainteresowany wynikiem tego, ponieważ this NuGet package używa również ogólnego wzorca repozytorium i memcached do adresowania tej samej techniki buforowania, a twój problem wydaje się być taki sam podczas deserializacji danych.

+1

@JK Czy mógłbyś podać, która metoda sprawdziła się w Twoim przypadku, jestem bardzo zainteresowany, ponieważ mam ten sam problem w moim projekcie. – erikvda