Добавление к предложению Где обновления в LinQ-to-Entities - PullRequest
5 голосов
/ 23 декабря 2008

Допустим, у меня есть таблица с именем Product, с тремя столбцами: Id, CustomerId, Name. Идентификатор является первичным ключом. Схема находится вне контроля моей группы, и теперь у нас есть требование всегда предоставлять CustomerId в качестве параметра для всех запросов (выбирает, обновляет, удаляет). Это длинная история, в которую я бы предпочел не вдаваться ... она включает триггеры: -P

Итак, мой вопрос, когда у меня есть присоединенная сущность в LinqToEntities, и я хочу сохранить некоторые обновления (скажем, я обновляю имя в этом случае). Как я могу получить его для генерации SQL:

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

Где параметр customerId включен в предложение where в дополнение к первичному ключу.

Спасибо: -)

Ответы [ 2 ]

7 голосов
/ 23 декабря 2008

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)

0 голосов
/ 23 декабря 2008

Один из способов - использовать сохраненный процесс для обновления . Это дает вам полный контроль над SQL.

Другой способ - добавить CustomerId к ключу объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...