Comment puis-je empêcher des objets EF réinsérant d'autres dbcontext?
-
25-10-2019 - |
Question
J'utilise EF 4.1 dans un projet MVC 3 et je rencontre des problèmes avec l'insertion d'un objet. J'utilise session, ainsi se tenir sur certains objets. Concrètement:
J'ai une classe simple avec une relation parent-enfant:
public class Event
{
public User Promotor {get;set;}
}
Le promoteur est basé sur le CurrentUser. Dans mon application je stocke la CurrentUser en session http. Maintenant, quand j'ajouter un événement comme celui-ci l'utilisateur (et tous les objets liés) est insérée une fois de plus avec une nouvelle clé primaire.
//1st request inserts/loads the user
User user;
using (var context = new MyDbContext())
{
user = new User();
context.Users.Add(user);
context.SaveChanges();
}
//2nd request saves the event
var before = db.Users.Count();
var @event = new Event
{
Promotor = user, //user was kept in Session
};
db.Entry(@event).State = EntityState.Added;
db.SaveChanges();
Quand je vérifie l'état de l'utilisateur, il est « ajouté » et bien que la clé primaire est 0 et EF devrait savoir qu'il est déjà persistant. Comment résoudre ce problème sans ajouter beaucoup de à mon code de persistance. Est-ce que je dois mon refixer currentuser à la nouvelle dbcontext à chaque demande? Cela conduira à db code « fuite » dans ma demande. Je veux garder les choses DB dans une couche de données. J'utilise un référentiel comme celui-ci:
public void Save(T entity)
{
dbContext.Entry(entity).State = IsPersistent(entity) ?
EntityState.Modified : EntityState.Added;
dbContext.SaveChanges();
}
La solution
Comme vous l'avez-vous déjà mentionné, refixer l'utilisateur à votre contexte actuel devrait résoudre le problème. La seule autre façon que je connaisse, serait de récupérer à nouveau une fois l'objet dans votre contexte en fonction de la valeur de clé primaire.