Pregunta

estaba probando un código con el objetivo EF "código de primera" método y se encontró con un problema extraño.

Mi DataContext:

    public class BookmarkerDataContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasKey(u => u.UserId);
            base.OnModelCreating(modelBuilder);
        }
     }

Cuando el objeto de usuario es:

   public class User
    {
        public long UserId { get; set; }
        public ICollection<Tag> Tags { get; set; }
    }

En mi código que estoy haciendo algo bastante simple:

public void UpdateUserTags(User user,ICollection<Tag> taglist)
    {
        user.Tags = new List<Tag>(user.Tags.Union(taglist));
        datacontext.Users.Add(user);
        datacontext.SaveChanges();
    }

El objeto de usuario que estoy pasando a esta función es el resultado de algo como:

datacontext.Users.SingleOrDefault(u => u.UserId==id)

Cada vez que llame a la función UpdateUserTags parece crear una nueva fila en la tabla de usuario en lugar de su actualización. ¿Estoy haciendo algo mal aquí?

¿Fue útil?

Solución

@Donald es correcta, es necesario Attach a la ObjectContext la hora de hacer cambios.

Sin embargo, eso es sólo si su entidad no está fijada.

Si suena como que ya han recuperado la entidad única a partir del gráfico:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);

Lo que significa que no es necesario adjuntar o conseguirlo de nuevo. Sólo hacer esto:

var user = datacontext.Users.SingleOrDefault(u => u.UserId==id);
user.Tags = new List<Tag>(user.Tags.Union(taglist));
context.SaveChanges();

Sin embargo, no recomendaría reemplazando toda Etiquetas colección, añadir las etiquetas:

user.Tags.Add(someTag);

HTH

Otros consejos

Creo que desee Adjuntar el objeto en el contexto de datos , en lugar de añadir a él.

public void UpdateUserTags(User user,ICollection<Tag> taglist)
{
    datacontext.Attach(user);
    user.Tags = new List<Tag>(user.Tags.Union(taglist));
    datacontext.SaveChanges();
}

Una vez que se adjunta, a continuación, el contexto se da cuenta del objeto. Una vez que guarde los cambios, deben ser persistieron a la base de datos.

¿No esta línea

datacontext.Users.Add (usuario);

Siempre marcar el registro de usuario como la necesidad de que se añaden a la tabla de usuarios.

Yo creo que hay que desprender el usuario de la antigua contexto y adjuntarlo al nuevo ser adecuadamente capaz de actualizar el registro. pero no soy tan EF Wonk ymmv

Esto no tiene nada que ver con su problema particular, pero para carga lenta que va a querer Etiquetas a marcar virtuales

public virtual ICollection<Tag> Tags { get; set; }

Además, parece que está intentando añadir nuevas etiquetas para un usuario (o actualizar sus etiquetas) si ese es el caso, entonces usted va a querer utilizar Fijar como sugiere Donald

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