Ajout à la clause Where d'une mise à jour dans LinQ-to-Entities

entity-framework linq linq-to-entities sql

Question

Disons que j'ai une table appelée Product, avec trois colonnes: Id, CustomerId, Name. Id est la clé primaire. Le schéma est en dehors du contrôle de mon groupe et nous devons maintenant toujours fournir CustomerId en tant que paramètre pour toutes les requêtes (sélection, mise à jour, suppression). C'est une longue histoire dans laquelle je préférerais ne pas m'engager… elle implique des déclencheurs :-P

Ma question est donc la suivante: lorsque j'ai une entité attachée dans LinqToEntities et que je souhaite enregistrer certaines mises à jour (disons que je mets à jour le nom dans ce cas). Comment puis-je l'obtenir pour générer le code SQL:

update Product set Name = @Name where Id=@Id and CustomerId=@CustomerId

Où le paramètre customerId est inclus dans la clause where en plus de la clé primaire.

Merci :-)

Réponse acceptée

CustomerId aide-t-il à identifier de manière unique la ligne au-delà de @Id? Je n'ai pas vraiment suivi le bit "déclencheurs", car le prédicat utilisé pour la mise à jour n'est pas connu du déclencheur. Ou vous voulez mettre à jour le CustomerId à chaque fois (détectable depuis UPDATE(...) dans le déclencheur)

L'option la plus simple consiste à le faire en tant que mises à jour d'objet:

var qry = from product in model.Products
          where Id == @Id && CustomerId == @CustomerId
          select product;

foreach(Product p in qry) {
    p.Name = @Name;
}

model.SaveChanges(); // or whatever the method is in EF

Si vous savez que vous attendez un enregistrement, vous pouvez utiliser:

Product prod = (from product in model.Products
          where Id == @Id && CustomerId == @CustomerId
          select product).Single();

prod.Name = @Name;
mode.SaveChanges(); // ditto

Vous pourrez peut- être aussi l'écrire en tant qu'Entity-SQL, mais je ne suis pas sûr que cela me dérangerait personnellement ... (mise à jour: je viens de vérifier, et je ne pense pas qu'Entity-SQL inclue le DML, non, vous ne pouvez pas - vous devez utiliser soit ce qui précède, soit une commande SQL normale / SPROC)


Réponse populaire

Une solution consisterait à utiliser un processus stocké pour effectuer la mise à jour . Cela vous donne un contrôle complet sur le SQL.

Une autre méthode consiste à ajouter le CustomerId à la clé d'entité.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow