2008-09-02 4 views
6

Как я могу обновить объект, который отключен от базы данных?Обновление в Linq

Код ниже работает неправильно и выбрасывает InvalidOperationExcepiton.

public void Foo() 
{ 
DataContext context = new DataContext(); 
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ; 
context.LinqEntities.Attach(item, true); 
} 

ответ

3

По умолчанию сущности будут использовать все поля для проверки параллелизма при редактировании. Это то, что бросает InvalidOperationException.

Это может быть установка свойства «Обновить проверку» для всех полей «Никогда». Это необходимо сделать для всех полей, чтобы прикрепить объект как измененный. Если это будет сделано, дополнительный вызов context.SubmitChanges() сохранит данные.

В качестве альтернативы, если вы знаете исходные значения, вы можете прикреплять и делать обновления, но все проверенные значения должны соответствовать исходным значениям.

LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
context.LinqEntities.Attach(item); 
item.Name = "John"; 
item.Surname = "Doe"; 
context.SubmitChanges(); 
1

Я не уверен, что вы подразумеваете под отключением от базы данных.

Похоже, вы пытаетесь вставить новую строку в таблицу LinqEntities - это правильно?

Если это так, вы будете хотеть сделать

context.LinqEntities.InsertOnSubmit(item); 
context.Submit(); 
1

OK, если вы пытаетесь обновить строку с ID = 1, вы будете делать это так:

DataContext context = new DataContext(); 
LinqEntity item = (from le in context.LinqEntities 
        where le.ID == 1 
        select le).Single(); 
item.Name = "John"; 
item.Surname = "Doe"; 

context.Submit(); 

Вы также могли бы заменить выражение Linq с более кратким лямбда:

LinqEntity item = context.LinqEntities.Single(le => le.ID == 1); 

самая важная вещь DataContext делает ПРОФ k любые изменения, которые вы делаете, чтобы при вызове метода Submit он автоматически генерировал инструкции Insert для вещей, которые вы изменили.

0

При использовании ORM вы обычно выбираете объект перед его обновлением.

Вы можете использовать DataContext.ExecuteCommand(...), чтобы обойти ORM, если вы не хотите делать выбор.

+0

Я не согласен с утверждением, что это типично. Это, конечно, не относится к ORM, который реализует шаблон ActiveRecord. По мнению многих, это ограничение Linq To SQL. Некоторые хорошие обсуждения здесь: http://www.west-wind.com/Weblog/posts/135659.aspx – 2009-02-11 23:08:18

Смежные вопросы