5

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

だから私の質問は、LinqToEntities に添付されたエンティティがあり、いくつかの更新を保存したい場合です (この場合、名前を更新しているとします)。SQLを生成するにはどうすればよいですか:

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

主キーに加えて、where 句に customerId パラメータが含まれています。

ありがとう :-)

4

2 に答える 2

7

CustomerId は、@Id を過ぎた行を一意に識別するのに役立ちますか? 更新に使用される述語がトリガーによって認識されないため、「トリガー」ビットには実際には従いませんでした。または、毎回 CustomerId を再更新したい (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としても書くことができるかもしれませんが、個人的には気にするかどうかはわかりません...(更新:確認したところ、Entity-SQLにはDMLが含まれていないと思いますので、いいえ、できません - 上記または通常の SQL コマンド/SPROC のいずれかを使用する必要があります)

于 2008-12-23T14:56:38.903 に答える
0

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

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

于 2008-12-23T14:28:53.747 に答える