Uso dei proxy

Quando si creano istanze di tipi di entità POCO, Entity Framework spesso crea istanze di un tipo derivato generato dinamicamente che funge da proxy per l'entità. Questo proxy esegue l'override di alcune proprietà virtuali dell'entità per inserire hook per l'esecuzione automatica di azioni quando si accede alla proprietà. Ad esempio, questo meccanismo viene usato per supportare il caricamento differita delle relazioni. Le tecniche illustrate in questo argomento si applicano in modo analogo ai modelli creati con Code First ed EF Designer.

Disabilitazione della creazione del proxy

A volte è utile impedire a Entity Framework di creare istanze proxy. Ad esempio, la serializzazione di istanze non proxy è notevolmente più semplice rispetto alla serializzazione delle istanze proxy. La creazione del proxy può essere disattivata cancellando il ProxyCreationEnabled flag. È possibile eseguire questa operazione nel costruttore del contesto. Ad esempio:

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

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

Si noti che Entity Framework non creerà proxy per i tipi in cui non è necessario eseguire alcuna operazione per il proxy. Ciò significa che è anche possibile evitare proxy con tipi sealed e/o senza proprietà virtuali.

Creazione esplicita di un'istanza di un proxy

Un'istanza proxy non verrà creata se si crea un'istanza di un'entità usando il nuovo operatore. Questo potrebbe non essere un problema, ma se è necessario creare un'istanza proxy (ad esempio, in modo che il caricamento differita o il rilevamento delle modifiche proxy funzionerà), è possibile farlo usando il Create metodo di DbSet. Ad esempio:

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

La versione generica di Create può essere usata se si vuole creare un'istanza di un tipo di entità derivata. Ad esempio:

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

Si noti che il Create metodo non aggiunge o collega l'entità creata al contesto.

Si noti che il Create metodo crea solo un'istanza del tipo di entità se si crea un tipo proxy per l'entità non avrà alcun valore perché non esegue alcuna operazione. Ad esempio, se il tipo di entità è sealed e/o non dispone di proprietà virtuali, Create verrà creata solo un'istanza del tipo di entità.

Recupero del tipo di entità effettivo da un tipo proxy

I tipi proxy hanno nomi simili al seguente:

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

È possibile trovare il tipo di entità per questo tipo di proxy usando il GetObjectType metodo da ObjectContext. Ad esempio:

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

Si noti che se il tipo passato a GetObjectType è un'istanza di un tipo di entità che non è un tipo proxy, viene comunque restituito il tipo di entità. Ciò significa che è sempre possibile usare questo metodo per ottenere il tipo di entità effettivo senza altri controlli per verificare se il tipo è un tipo proxy o meno.