LinQからエンティティへの更新のWhere句への追加

entity-framework linq linq-to-entities sql

質問

Productという名前のテーブルに、Id、CustomerId、Nameの3つの列があるとします。 Idが主キーです。このスキーマは私のグループの管理外にあり、すべてのクエリ(選択、更新、削除)のパラメータとして常にCustomerIdを提供するという要件があります。それは私が入りたくない長い話です...それは引き金を含みます:-P

だから私の質問は、私がLinqToEntitiesにアタッチされたエンティティを持っていて、いくつかの更新を保存したいときです。 SQLを生成するにはどうすればよいですか。

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

customerIdパラメータが主キーに加えてwhere句に含まれる場所。

ありがとう:-)

受け入れられた回答

CustomerIdは@Id以降の行を一意に識別するのに役立ちますか?更新に使用される述語はトリガーによって認識されないため、私は実際には "トリガー"ビットに従いませんでした。または毎回CustomerIdを再更新しますかUPDATE(...)トリガのUPDATE(...)から検出可能)

最も簡単な方法は、オブジェクトの更新としてそれを行うことです。

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

あなたが1つのレコードを期待していることを知っているなら、あなたは使うことができます:

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

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

あなたそれをEntity-SQLとして書くこともできるかもしれませんが 、個人的には気にしないかと思いません...いいえ、できません - 上記のいずれか、または通常のSQLコマンド/ SPROCを使用する必要があります。


人気のある回答

1つの方法は、更新を行うためにストアドプロシージャを使用することです 。これにより、SQLを完全に制御できます。

別の方法は、CustomerIdをエンティティキーに追加することです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ