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();
    }
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top