Я хочу обновить единственное поле объекта, когда я знаю идентификатор объекта.
Действительно ли это возможно в LINQ к SQL, не получая полный объект (со всеми полями от DataContext, который является служебным)? Действительно ли возможно создать и присоединить объект к DataContext и отметить точное поле (поля) для синхронизации на DataContext. SubmitChanges (или что-то как этот)?
Заранее спасибо!
Да, вы можете:
Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();
В вашем Dbml установите UpdateCheck = "Never" для всех свойств.
Это сгенерирует один оператор обновления без выбора.
Одно предостережение: если вы хотите установить для Name значение null, вам придется инициализировать свой объект foo другим значением, чтобы Linq мог обнаружить изменение:
Foo foo=new Foo { FooId=fooId, Name="###" };
...
foo.Name=null;
Если вы хотите проверять метку времени при обновлении это тоже можно сделать:
Foo foo=new Foo { FooId=fooId, Modified=... };
// Modified needs to be set to UpdateCheck="Always" in the dbml
Вы всегда можете создать стандартный оператор T-SQL и выполнить его для своего хранилища данных:
YourDataContext
.ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null);
С самим Linq-to-SQL вы не можете этого сделать - основное предположение состоит в том, что он всегда воздействует на объект, на весь объект и только на объект.
Если вам нужно делать это на регулярной основе, одним из способов было бы обернуть его в сохраненную процедуру и добавить эту сохраненную процедуру в контекст данных в качестве метода, который вы можете вызывать в контексте данных.
Вы можете обновить объект. В этом примере будет изменено имя человека:
Person person = _entities.Persons.FirstOrDefault(p => p.Id == id);
person.FirstName = "Bill";
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person);
_entities.SaveChanges();