Mettre à jour plusieurs lignes dans Entity Framework à partir d'une liste d'identifiants

93

J'essaie de créer une requête pour le cadre d'entité qui me permettra de prendre une liste d'identifiants et de mettre à jour un champ qui leur est associé.

Exemple en SQL:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

Comment puis-je convertir ce qui précède en structure d'entité?

tout codé
la source
Quelle est votre plate-forme de base de données Oracle mysql ..
zee
Ma base de données est Microsoft SQL
entièrement codée le
Il existe deux projets open source permettant cela: EntityFramework.Extended et E ntity Framework Extensions .
Peter Kerr

Réponses:

164

quelque chose comme ci-dessous

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

METTRE À JOUR:

vous pouvez mettre à jour plusieurs champs comme ci-dessous

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });
Damith
la source
Puis-je mettre à jour plus d'un champ dans le foreach ci-dessus que vous venez d'envoyer par lequel est exactement ce que j'ai demandé. juste curieux de savoir si vous pouviez faire plus? Ne semble pas non plus que SubmitChanges fonctionne plus. J'utilise le dernier framework d'entité. Peut-être SaveChanges ()?
codés le
10
ForEachest une méthode List, et il est généralement déconseillé d'utiliser car ce n'est pas une manière très fonctionnelle de programmer. Utilisez simplement foreach (l'opérateur) comme une personne normale.
BlueRaja - Danny Pflughoeft
53
L'utilisation de cette solution génère une requête de mise à jour pour chaque élément de la liste. Existe-t-il un moyen d'amener EF à faire une seule requête comme dans la question? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow
19
Sachez que c'est une manière assez inefficace de procéder du point de vue de la base de données. Non seulement cela émet une grande instruction select impliquant chaque ligne de la table Friends, mais il émet une commande UPDATE distincte pour chaque enregistrement mis à jour. Ainsi, plutôt que d'émettre une seule commande, vous émettez potentiellement de nombreuses commandes ainsi que la diffusion en continu d'un tas de données hors de votre base de données.
d512 le
1
@ShekharPankaj, en gros, ce que vous voulez faire est d'émettre une commande SQL comme "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Je ne pense pas qu'EF ait un soutien direct pour faire cela. Je crois qu'il existe des solutions tierces à cela ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) mais je ne les ai pas utilisées. Les autres options consistent à utiliser ADO.NET brut au lieu d'EF.
d512