2008-12-22 93 views
4

假设我有一个名为Product的表,其中包含三列:Id,CustomerId,Name。 Id是主键。该模式不在我的组的控制之下,现在我们需要始终提供CustomerId作为所有查询(选择,更新,删除)的参数。这是一个漫长的故事,我宁愿不进入......它涉及触发器:-P添加到LinQ-to-Entities更新的Where子句中

所以我的问题是,当我有一个LinqToEntities附加实体,并且我想保存一些更新(说我在这种情况下更新名称)。我如何才能生成SQL:

update Product set Name = @Name where [email protected] and [email protected] 

其中除了主键之外,where子句中还包含customerId参数。

感谢:-)

回答

7

CustomerId是否唯一标识过去的@Id行?我没有真正遵循“触发器”位,因为用于更新的谓词不被触发器知道。或者你想每次(在触发检测从UPDATE(...))重新更新客户ID

最简单的方法是做它作为对象更新:

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 

威力也可以写为实体-SQL,但是我不知道我会烦,亲自...(更新:我刚刚检查,我不认为Entity-SQL包含DML ,所以不行,你不能 - 你必须使用上面的,或者使用常规的SQL命令/ SPROC)

+0

CustomerId不是主键的一部分,但由于DBA有一些触发器,它必须位于更新语句的Where子句中。所以上面的方法是行不通的,因为保存更改最终只会在where子句中使用Id = @ Id创建更新语句:-( – 2008-12-23 16:55:53

0

一种方法是use a stored proc to do the update。这使您可以完全控制SQL。

另一种方法是将CustomerId添加到实体键。

+1

我们希望避免几乎所有代价的花费...试图避免重写很多代码已经作为LINQ更新存在 – 2008-12-23 14:49:20