添加到LinQ-to-Entities中的Update的Where子句

entity-framework linq linq-to-entities sql

假設我有一個名為Product的表,有三列:Id,CustomerId,Name。 Id是主鍵。模式超出了我的組的控制範圍,我們現在要求始終將CustomerId作為所有查詢(選擇,更新,刪除)的參數。這是一個很長的故事,我寧願不介入......它涉及觸發器:-P

所以我的問題是,當我在LinqToEntities中有一個附加實體時,我想保存一些更新(比如我在這種情況下更新名稱)。如何讓它生成SQL:

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

除了主鍵之外,customerId參數包含在where子句中。

謝謝 :-)

一般承認的答案

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

如果您知道您希望有一條記錄,則可以使用:

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)


熱門答案

一種方法是使用存儲過程來進行更新 。這使您可以完全控制SQL。

另一種方法是將CustomerId添加到實體密鑰。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因