2010-12-03 8 views

Respuesta

12

Creo que puede deberse a que está configurando los valores antes de adjuntar el objeto; el contexto de datos no sabrá qué campos han cambiado. Proveedores:

public void UpdatePlayer(int id) 
{ 
    Player player = new Player() {ID = id}; 
    Entities.Players.Attach(player); 
    player.Password = "12"; 
    Entities.SaveChanges(); 
} 
+0

ese era el problema :) – Adir

+0

Los buenos viejos "Talón de entidades" truco - cortesía de Alex James. +1 – RPM1984

3

Adjuntar se utiliza para las entidades que ya existen en la base de datos, pero hay que sujetar primero, y luego editarlo, como otra crítica señaló. debe usar .Agregar en lugar de. Adjuntar si está creando elementos nuevos.

FYI Entity Framework 4 - AddObject vs Attach

+0

Sospecho que no está tratando de agregar una nueva instancia, de lo contrario, no estaría proporcionando una identificación ... ¿Adir? editar: también el título es cómo * actualizar * una entidad :) –

+0

No creo que sea así como se consulta a una persona, entonces – Artemiy

+0

No creo que esté preguntando por una, simplemente actualizando una: la EF no admite la actualización de una entidad de esta manera - Acabo de probarlo y si invierte la 2ª y 3ª líneas, funciona. –

1

Cuando se adjunta una entidad usando Acople método, la entidad pasará al Sin cambios EntityState, es decir, no ha cambiado desde que se adjunta al contexto. Por lo tanto, EF no generará una declaración de actualización necesaria para actualizar la base de datos.

Todo lo que necesita hacer es dar una pista a EF cambiando el EntityState a Modified:

Entities.Players.Attach(player);  
Entities.ObjectStateManager.ChangeObjectState(player, EntityState.Modified)  
Entities.SaveChanges(); 
2

Como ya se ha mencionado al adjuntar entidad que se establece en el estado sin cambios por lo que tiene para configurar manualmente el estado en Modificado. Pero tenga en cuenta que configurar el estado para la entidad completa puede causar la actualización de todos los campos. Por lo tanto, si su entidad de jugador tiene más campos Id y contraseña, todos los demás campos probablemente se establecerán en valores predeterminados. Para tal caso, trate de usar:

Entities.Players.Attach(player); 
var objectState = Entities.ObjectStateManager.GetObjectStateEntry(player); 
objectState.SetModifiedProperty("Password"); 
Entities.SaveChanges(); 

También puede intentar establecer la contraseña después de unir la entidad:

Entities.Players.Attach(player); 
player.Password = "12"; 
Entities.SaveChanges(); 
Cuestiones relacionadas