5

假设我有一个名为 Product 的表,其中包含三列:Id、CustomerId、Name。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

如果你知道你期待一个记录,你可以使用:

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

一种方法是使用存储过程进行更新。这使您可以完全控制 SQL。

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

于 2008-12-23T14:28:53.747 回答