Добавление к предложению Где обновления в LinQ-to-Entities

entity-framework linq linq-to-entities sql

Вопрос

Допустим, у меня есть таблица с именем Product, с тремя столбцами: Id, CustomerId, Name. Идентификатор является первичным ключом. Схема находится вне контроля моей группы, и теперь у нас есть требование всегда предоставлять 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 к ключу объекта.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему