Изменение объектов в LINQ to SQL

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

При получении объектов из базы данных в контекст DataContext эти объекты кэшируются, и у них устанавливается состояние Unchanged. Если мы изменим значения свойств какого-либо объекта из полученного набора, то DataContext для этого объекта создает копию с измененными значениями и устанавливает у нее статус ToBeUpdated.

При вызове метода SubmitChanges() контекст данных сверяет значения оригинального объекта и его измененной копии. И если два объекта отличаются, то создается sql-выражение UPDATE, с помощью которого происходит обновление объекта в базе данных.

Для примера получим первый объект из базы данных, изменим его и произведем сохранение:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
DataContext db = new DataContext(connectionString);
Console.WriteLine("До обновления");
foreach (var user in db.GetTable<User>().Take(5))
{
    Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age);
}
Console.WriteLine();

// возьмем первого пользователя
User user1 = db.GetTable<User>().FirstOrDefault();
// и изменим у него возраст
user1.Age = 28;
// сохраним изменения
db.SubmitChanges();
			
Console.WriteLine();
Console.WriteLine("После обновления");
foreach (var user in db.GetTable<User>().Take(5))
{
    Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age);
}
Обновление в LINQ to SQL

Поскольку начальный и измененный возраст не совпадают, то будет сгенерировано следующее sql-выражение, которое обновит базу данных:

UPDATE [Users]
SET [Age] = @p3
WHERE ([Id] = @p0) AND ([Name] = @p1) AND ([Age] = @p2)

@p0 int,
@p1 nvarchar(4000),
@p2 int,@p3 int

@p0=2,@p1='Eugene',@p2=28,@p3=31
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850