При получении объектов из базы данных в контекст DataContext эти объекты кэшируются, и у них устанавливается состояниеUnchanged
. Если мы изменим значения свойств какого-либо объекта из полученного набора, то DataContext для этого объекта создает копию с измененными значениями и устанавливает у нее статус ToBeUpdated
.
При вызове метода SubmitChanges() контекст данных сверяет значения оригинального объекта и его измененной копии. И если два объекта отличаются, то создается sql-выражение UPDATE, с помощью которого происходит обновление объекта в базе данных.
Для примера получим первый объект из базы данных, изменим его и произведем сохранение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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); } |
Поскольку начальный и измененный возраст не совпадают, то будет сгенерировано следующее sql-выражение, которое обновит базу данных:
1 2 3 4 5 6 7 8 9 |
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 |