Wie verhindern Sie, dass EF Objekte eines anderen DBContext wiederinseressen?
-
25-10-2019 - |
Frage
Ich verwende EF 4.1 in einem MVC 3 -Projekt und habe Probleme beim Einfügen eines Objekts. Ich benutze auch die Sitzung, um an einigen Objekten festzuhalten. In Beton :
Ich habe eine einfache Klasse mit einer Eltern -Kind -Beziehung:
public class Event
{
public User Promotor {get;set;}
}
Der Promotor basiert auf dem Stromer. In meiner Bewerbung speichere ich den aktuellen Leiter in der HTTP -Sitzung. Wenn ich nun ein solches Ereignis hinzufüge, wird der Benutzer (und alle zugehörigen Objekte) noch einmal mit einem neuen Primärschlüssel eingefügt.
//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();
Wenn ich den Status des Benutzers überprüfe, wird er auch "hinzugefügt", obwohl der Hauptschlüssel nicht 0 ist und EF wissen sollte, dass er bereits hartnäckig ist. Wie kann dies behoben werden, ohne meinen Persistenzcode viel hinzuzufügen? Muss ich meinen aktuellen DBContext auf jede Anfrage wieder in den neuen DBContext wiederholen? Dies führt dazu, dass DB -Code in meine Anwendung „eingeht“. Ich möchte das DB -Zeug in einer Datenebene behalten. Ich benutze ein solches Repository:
public void Save(T entity)
{
dbContext.Entry(entity).State = IsPersistent(entity) ?
EntityState.Modified : EntityState.Added;
dbContext.SaveChanges();
}
Lösung
Wie Sie bereits erwähnt haben, sollte das Wiederanbringen des Benutzer in Ihren aktuellen Kontext das Problem lösen. Die einzige andere Möglichkeit, die ich kenne, wäre, das Objekt erneut in Ihrem Kontext basierend auf dem Primärschlüsselwert abzurufen.