4 votes

Comment détacher les entités des contextes EF Code First

Cela semble beaucoup plus difficile que cela ne devrait l'être.

Je suis en train d'écrire un site d'enregistrement d'événements en utilisant MVC3, SQL Compact Edition et Entity Frameworks Code First, tout en utilisant le package NuGet Mvc Scaffolding de Steven Sanderson.

Comme la liste des événements ne devrait pas changer beaucoup, je la mets en cache dans une liste globale dans la méthode Application_Start :

        var repo = new RaceEventRepository();
            EventRaces =
                repo.All.Where(r => r.RaceName.Contains(eventName)).Select(r => r).ToList();

où RaceEventRepository est une classe de répertoire construite par MvcScaffolding, et fait un

EventContext context = new EventContext();

qui est ensuite utilisé dans tout le répertoire, et (j'imagine) est disposé lorsque le Répertoire est disposé. et EventRaces est une liste disponible globalement.

Mon problème est que lorsque je crée ensuite un enregistrement d'inscrit avec une clé étrangère vers l'événement de course stocké dans EventRaces, j'obtiens une erreur "Un objet d'entité ne peut pas être référencé par plusieurs instances de IEntityChangeTracker".

Selon plusieurs billets de blog et réponses SO, je dois Détacher les entités mises en cache du contexte comme dans la liste 1 de ce post.

Mon problème est que, en utilisant ObjectBrowser, je ne trouve rien avec une méthode Detach. Le contexte dans le Répertoire n'en a pas. Les différents DbSets dans le contexte n'en ont pas (bien qu'ils aient une méthode Attach()). System.Data.Object.ObjectSet en a une, mais je ne trouve pas de correspondance entre un DbSet et un ObjectSet.

De toute évidence, je rate quelque chose. Est-ce que quelqu'un peut me guider dans la bonne direction ?

15voto

Slauma Points 76561

Vous pouvez soit utiliser la méthode d'extension AsNoTracking pour interroger votre liste sans attacher les objets au contexte ...

var repo = new RaceEventRepository();
EventRaces = repo.All.AsNoTracking()
    .Where(r => r.RaceName.Contains(eventName))
    .ToList();

... ou vous pouvez détacher des entités individuelles du contexte en définissant leur état sur Detached:

context.Entry(raceEvent).State = EntityState.Detached;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X