Praca z serwerami proxy

Podczas tworzenia wystąpień typów jednostek POCO platforma Entity Framework często tworzy wystąpienia dynamicznie generowanego typu pochodnego, który działa jako serwer proxy dla jednostki. Ten serwer proxy zastępuje niektóre właściwości wirtualne jednostki w celu wstawiania punktów zaczepienia do wykonywania akcji automatycznie po korzystaniu z właściwości. Na przykład ten mechanizm służy do obsługi leniwego ładowania relacji. Techniki przedstawione w tym temacie dotyczą modeli utworzonych przy użyciu podejścia „najpierw kod” i narzędzia EF Designer.

Wyłączanie tworzenia serwera proxy

Czasami warto uniemożliwić programowi Entity Framework tworzenie wystąpień serwera proxy. Na przykład serializowanie wystąpień innych niż proxy jest znacznie łatwiejsze niż serializowanie wystąpień serwera proxy. Tworzenie serwera proxy można wyłączyć, usuwając flagę ProxyCreationEnabled . Jednym z miejsc, które można zrobić, jest konstruktor kontekstu. Przykład:

public class BloggingContext : DbContext
{
    public BloggingContext()
    {
        this.Configuration.ProxyCreationEnabled = false;
    }  

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

Należy pamiętać, że program EF nie utworzy serwerów proxy dla typów, w których nie ma nic wspólnego z serwerem proxy. Oznacza to, że można również uniknąć serwerów proxy, używając typów, które są zapieczętowane i/lub nie mają właściwości wirtualnych.

Jawne tworzenie wystąpienia serwera proxy

Wystąpienie serwera proxy nie zostanie utworzone, jeśli utworzysz wystąpienie jednostki przy użyciu nowego operatora. Może to nie być problem, ale jeśli musisz utworzyć wystąpienie serwera proxy (na przykład tak, aby ładowanie leniwe lub śledzenie zmian serwera proxy zadziałało), możesz to zrobić przy użyciu Create metody DbSet. Przykład:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Create();
}

Wersję Create ogólną programu można użyć, jeśli chcesz utworzyć wystąpienie typu jednostki pochodnej. Przykład:

using (var context = new BloggingContext())
{
    var admin = context.Users.Create<Administrator>();
}

Pamiętaj, że Create metoda nie dodaje ani nie dołącza utworzonej jednostki do kontekstu.

Należy pamiętać, że Create metoda utworzy tylko wystąpienie typu jednostki, jeśli utworzenie typu serwera proxy dla jednostki nie będzie miało wartości, ponieważ nie zrobi nic. Jeśli na przykład typ jednostki jest zapieczętowany i/lub nie ma żadnych właściwości wirtualnych, po Create prostu utworzy wystąpienie typu jednostki.

Pobieranie rzeczywistego typu jednostki z typu serwera proxy

Typy serwerów proxy mają nazwy podobne do następujących:

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

Typ jednostki dla tego typu serwera proxy można znaleźć przy użyciu GetObjectType metody z ObjectContext. Przykład:

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);
    var entityType = ObjectContext.GetObjectType(blog.GetType());
}

Należy pamiętać, że jeśli typ przekazany do GetObjectType jest wystąpieniem typu jednostki, który nie jest typem serwera proxy, typ jednostki jest nadal zwracany. Oznacza to, że zawsze można użyć tej metody, aby uzyskać rzeczywisty typ jednostki bez żadnego innego sprawdzania, czy typ jest typem serwera proxy, czy nie.