2010-09-16 4 views
1

Je dois charger un objet à partir de la base de données, modifier certains de ses champs et relations, puis je souhaite stocker une nouvelle valeur pour un seul champ, sans modifier le reste.Comment mettre à jour un seul champ d'une entité avec Entity Framework?

Il ressemblerait à quelque chose comme ceci:

var thing = db.Things.First(); 

thing.Field1 = "asdas"; 
thing.Field2 = 23; 
thing.OtherThings.Add(new OtherThing()); 
thing.FieldToUpdate = doSomething(thing); 

db.SaveChanges(); 

Mais cela sauverait tous les changements, ce que je veux est seulement sauver FieldToUpdate ...

Je l'ai regardé autour et tout ce que je » Je trouve qu'il faut utiliser des procédures stockées, ce qui semble être trop pour quelque chose qui semble si simple, en plus je devrais faire une procédure stockée différente pour chaque fois que je dois faire quelque chose comme ça ...

Ma solution actuelle est d'ouvrir un autre contexte, charger la chose ag ain, mettez à jour FieldToUpdate et SaveChanges, mais c'est à la fois inefficace et laid.

Répondre

0

Entity Framework est assez intelligent pour comprendre ce qui a changé et ce qui n'a pas été optimisé et l'instruction SQL est utilisée en conséquence. Si vous modifiez uniquement FieldToUpdate, l'instruction SQL sera uniquement une mise à jour sur le champ unique, pas sur tout. Cependant, si vous changez Field1 et Field2 par rapport à ce qu'ils étaient à l'origine, ils seront également conservés, mais SEULEMENT s'ils ont changé. Sinon, il n'est pas nécessaire d'indiquer à la base de données de le remplacer par ce qu'elle est déjà.

Le framework d'entité le fait de cette façon parce que c'est exactement ce que le développeur veut 99,9% du temps. Si vous voulez utiliser un objet entité comme objet que vous souhaitez déplacer et manipuler autrement que comme un modèle de la base de données (comme il se doit), vous pouvez envisager de créer une autre classe wrapper cela vous permet de jouer avec tous les champs de données que vous voulez (et d'en avoir d'autres qui ne s'y trouvent pas), et de faire en sorte que la méthode save fasse persister la structure d'entité appropriée, pour que les choses restent séparées et propres.

2

Si vous voulez faire cela avec l'entité jointe, vous devez mettre à jour FieldToUpdate FIRST et appeler SaveChanges. Que vous pouvez mettre à jour d'autres champs et appeler à nouveau SaveChanges si nécessaire. Aucun autre moyen avec l'entité attachée.

D'autre façon que vous pouvez essayer est de détacher l'entité, modifier ce que vous voulez (il ne suivra pas les changements). Ensuite, fixez l'entité au contexte de retour et d'appeler:

// I suppose that db is ObjectContext or inherited type 
db.ObjectStateManager.GetObjectStateEntry(thing).SetModifiedProperty("FieldToUpdate"); 

Maintenant que FieldToUpdate est suivie comme changé.

Questions connexes