Utilisation des proxys

Lors de la création d’instances de types d’entités POCO, Entity Framework crée souvent des instances d’un type dérivé généré dynamiquement qui agit comme proxy pour l’entité. Ce proxy remplace certaines propriétés virtuelles de l’entité pour insérer des hooks pour effectuer des actions automatiquement lorsque la propriété est accessible. Par exemple, ce mécanisme est utilisé pour prendre en charge le chargement différé de relations. Les techniques présentées dans cette rubrique s’appliquent également aux modèles créés avec Code First et EF Designer.

Désactiver la création d’un proxy

Parfois, il peut être utile d’empêcher Entity Framework de créer des instances proxy. Par exemple, la sérialisation d’instances non proxy est considérablement plus facile que la celle des instances proxy. La création du proxy peut être désactivée en effaçant l’indicateur ProxyCreationEnabled . Vous pouvez le faire notamment dans le constructeur de votre contexte. Par exemple :

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

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

Notez que EF ne crée pas de proxys pour les types pour lesquels le proxy n’a aucune utilité. Cela signifie que vous pouvez également éviter de créer des proxys en ayant des types sealed et/ou sans propriétés virtuelles.

Création explicite d’une instance d’un proxy

Une instance proxy ne sera pas créée si vous créez une instance d’une entité à l’aide du nouvel opérateur. Cela peut ne pas être un problème, mais si vous devez créer une instance de proxy (par exemple, pour que le chargement différé ou le suivi des modifications du proxy fonctionne), vous pouvez le faire à l’aide de la méthode Create de DbSet. Par exemple :

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

La version générique de Create peut être utilisée si vous souhaitez créer une instance d’un type d’entité dérivée. Par exemple :

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

Notez que la méthode Create n’ajoute pas ou n’attache pas l’entité créée au contexte.

Notez que la méthode Create crée seulement une instance du type d’entité si la création d’un type proxy pour l’entité n’apporte aucune utilité supplémentaire. Par exemple, si le type d’entité est sealed et/ou n’a pas de propriétés virtuelles, dans ce casCreate va seulement créer une instance du type d’entité.

Obtenir le type d’entité réel à partir d’un type proxy

Les types de proxy ont des noms qui ressemblent à ceci :

System.Data.Entity.DynamicProxies.Blog_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

Vous pouvez trouver le type d’entité pour ce type de proxy à l’aide de la méthode GetObjectType à partir de ObjectContext. Par exemple :

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

Notez que si le type passé à GetObjectType est une instance d’un type d’entité qui n’est pas un type proxy, le type d’entité est toujours retourné. Cela signifie que vous pouvez toujours utiliser cette méthode pour obtenir le type d’entité réel sans aucune autre vérification pour savoir si le type est un type proxy ou non.