Pregunta

Estoy usando EF 4.1 en un proyecto MVC 3 y tengo problemas para insertar un objeto. También estoy usando la sesión para aferrarme a algunos objetos. En concreto :

Tengo una clase simple con una relación padre -hijo:

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

El promotor se basa en CurrentUser. En mi aplicación almaceno el UCTURYUSer en la sesión HTTP. Ahora, cuando agrego un evento como este, el usuario (y todos los objetos relacionados) se inserta una vez más con una nueva clave 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();

Cuando verifique el estado del usuario, también se 'agregue', aunque la clave principal no es 0 y EF debería saber que ya es persistente. ¿Cómo puede solucionar esto sin agregar mucho a mi código de persistencia? ¿Tengo que volver a colocar mi UCTURUSer en el nuevo DBContext en cada solicitud? Esto conducirá al código DB 'filtración' a mi aplicación. Quiero mantener las cosas de DB en una capa de datos. Estoy usando un repositorio como este:

    public void Save(T entity)
    {
        dbContext.Entry(entity).State = IsPersistent(entity) ? 
            EntityState.Modified : EntityState.Added;
        dbContext.SaveChanges();
    }
¿Fue útil?

Solución

Como ya se ha mencionado, volver a colocar al usuario a su contexto actual debería resolver el problema. La única otra forma que sé sería recuperar el objeto una vez más en su contexto en función del valor clave principal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top