2010-12-03 4 views

Répondre

12

Je pense que c'est peut-être parce que vous définissez les valeurs avant de joindre l'objet - le contexte de données ne saura pas quels champs ont changé. Essayez:

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

C'était le problème :) – Adir

+0

Le bon vieux truc « stub » entité - compliments d'Alex James. +1 – RPM1984

3

attach est utilisé pour les entités qui existent déjà dans la base de données, mais vous devez attacher d'abord, puis le modifier, comme un autre a souligné. vous devriez utiliser .Add au lieu de .Attach si vous créez de nouveaux éléments.

Pour votre information Entity Framework 4 - AddObject vs Attach

+0

Je soupçonne qu'il n'essaie pas d'ajouter une nouvelle instance, sinon il ne fournirait pas un identifiant ... Adir? edit: aussi le titre est comment * mettre à jour * une entité :) –

+0

Je ne pense pas que c'est comme ça que vous interrogez une personne alors – Artemiy

+0

Je ne pense pas qu'il en demande une, juste en mettre une à jour - l'EF supporte la mise à jour entité de cette façon - Je viens de l'essayer et si vous inverser les 2e et 3e lignes cela fonctionne. –

1

Lorsque vous connectez une entité en utilisant méthode Attach, l'entité entrera en Inchangé EntityState, qui est, il n'a pas changé depuis qu'il a été attaché au contexte. Par conséquent, EF ne générera pas l'instruction de mise à jour nécessaire pour mettre à jour la base de données.

Tout ce que vous devez faire est de donner un indice à EF en changeant la EntityState-Modified:

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

Comme nous l'avons mentionné lorsque vous connectez l'entité, il est mis à l'état Inchangé de sorte que vous avez pour définir manuellement l'état sur Modifié. Mais sachez que la définition de l'état pour l'entité entière peut provoquer la mise à jour de tous les champs. Donc, si votre entité Player a plus de champs Id et Password, tous les autres champs seront probablement définis par défaut. Pour ce cas, essayez d'utiliser:

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

Vous pouvez également essayer de mettre un mot de passe après avoir fixé l'entité:

Entities.Players.Attach(player); 
player.Password = "12"; 
Entities.SaveChanges(); 
Questions connexes