Domanda

Sto usando EF 4.1 in un progetto MVC 3 e sto avendo problemi con l'inserimento di un oggetto. Sto usando sessione così a tenere su alcuni oggetti. In concreto:

Ho una semplice classe con una relazione genitore-figlio:

public class Event
{
    public User Promotor {get;set;}
}

Il promotore si basa sulla CurrentUser. Nella mia applicazione devo conservare il CurrentUser in http sessione. Ora, quando aggiungo un evento come questo l'utente (e tutti gli oggetti correlati) viene inserito ancora una volta con una nuova chiave primaria.

        //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();

Quando posso controllare lo stato dell'utente è 'aggiunto' come bene anche se la chiave primaria non è 0 e EF dovrebbe sapere che è già persistente. Come si può risolvere questo problema senza l'aggiunta di un sacco di al mio codice persistenza. Devo riattaccare la mia currentuser alla nuova DbContext su ogni richiesta? Questo porterà a db codice 'fuoriuscita' nella mia applicazione. Voglio mantenere la roba DB in uno strato di dati. Sto usando un repository in questo modo:

    public void Save(T entity)
    {
        dbContext.Entry(entity).State = IsPersistent(entity) ? 
            EntityState.Modified : EntityState.Added;
        dbContext.SaveChanges();
    }
È stato utile?

Soluzione

Come si è già accennato te, riattaccare l'utente al tuo contesto attuale dovrebbe risolvere il problema. L'unico altro modo che conosco, sarebbe quello di recuperare l'oggetto, ancora una volta nel vostro contesto in base al valore della chiave primaria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top