Entity Framework Code First - Aucune méthode Detach () sur DbContext

code-first entity-framework

Question

Je me demande pourquoi il n'y a pas de méthode Detach sur l'objet DbContext comme il en existe pour ObjectContext. Je ne peux que supposer que cette omission était intentionnelle, mais j’ai du mal à comprendre pourquoi. Â Je dois être capable de détacher et de ré-attacher des entités (pour placer le cache dans un projet ASP.NET, par exemple). Â Cependant, comme je ne peux pas détacher une entité, lorsque je tente de joindre une entité associée à un contexte précédent, je reçois l’exception "Un objet entité ne peut pas être référencé par plusieurs instances de IEntityChangeTracker".

Quel est le guidage ici? Â Est-ce que je manque quelque chose?

Réponse acceptée

Pour les personnes qui pourraient trébucher sur cette question, à partir de CTP5, vous devez maintenant écrire

((IObjectContextAdapter)context).ObjectContext

afin d'arriver à ObjectContext.


Réponse populaire

DbContext utilise un ObjectContext en interne et l'équipe EF le rend disponible en tant que propriété protégée au cas où vous auriez besoin de passer à l'API de niveau inférieur et que cela sonne comme ceci est le cas ici. Vous pouvez donc utiliser ou exposer les fonctionnalités requises à partir d'une DbContext:

public class YourContext : DbContext 
{
    public void Detach(object entity) 
    {
        ObjectContext.Detach(entity);            
    }
}

Vous pouvez ensuite appeler cette méthode depuis votre contrôleur pour détacher une entité.

Alternativement, vous pouvez le changer pour avoir même une API plus riche:

public class YourContext : DbContext
{
    public void ChangeObjectState(object entity, EntityState entityState)
    {
        ObjectContext.ObjectStateManager.ChangeObjectState(entity, entityState);
    }
}

Voici à quoi ressemble DbContext à partir de métadonnées:

public class DbContext : IDisposable 
{      
    protected System.Data.Objects.ObjectContext ObjectContext { get; }
    ...
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow