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 sovrascrive alcune proprietà virtuali dell'entità per inserire degli hook per l'esecuzione automatica di azioni quando si accede alla proprietà. Ad esempio, questo meccanismo viene usato per supportare il caricamento differito delle relazioni. Le tecniche illustrate in questo argomento si applicano allo stesso modo ai modelli creati con Code First e 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. Per 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 puoi anche evitare i proxy con tipi che sono sigillati 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. Per 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. Per 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 metodo Create creerà semplicemente un'istanza del tipo di entità stesso se la creazione di un tipo proxy per l'entità non avrà alcun valore, poiché non eseguirebbe 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. Per 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.