Возможно ли обновить базу данных SQLite только теми свойствами, которые изменились? - PullRequest
0 голосов
/ 23 декабря 2010

таким образом я обновляю ВСЕ свойства сущности Pupil.Как я могу обновить только те свойства, которые действительно изменились / испортились ...

Я знаю, что существует своего рода шаблон, добавляющий флаг IsDirty в модель / viewModel, но добавляющий для каждого свойства такой флаг?Затем выполните всю проверку и динамическое построение коллекции SQLiteParameter: не слишком ли много накладных расходов?

Не лучше ли просто обновить ALL?

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction())
{
  using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager))
  {
     com.Parameters.Add(new SQLiteParameter("@pupilId", pupil.Id));
     com.Parameters.Add(new SQLiteParameter("@firstname", pupil.FirstName));
     com.Parameters.Add(new SQLiteParameter("@lastname", pupil.LastName));
     com.Parameters.Add(new SQLiteParameter("@gender", pupil.Gender));
     com.Parameters.Add(new SQLiteParameter("@street", pupil.Street));
     com.Parameters.Add(new SQLiteParameter("@city", pupil.City));
     com.Parameters.Add(new SQLiteParameter("@postal", pupil.Postal));
     com.Parameters.Add(new SQLiteParameter("@phone", pupil.Phone));
     com.Parameters.Add(new SQLiteParameter("@email", pupil.Email));
     com.Parameters.Add(new SQLiteParameter("@extrainformation",pupil.ExtraInformation));

     com.CommandText = "UPDATE pupil SET firstname = @firstname, lastname = @lastname, gender = @gender, street = @street," + " city = @city, postal = @postal, phone = @phone, email = @email, extrainformation = @extrainformation WHERE pupilId = @pupilId";
     com.ExecuteNonQuery();
    }
     trans.Commit();
} 

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Да, вы можете отслеживать каждое измененное свойство, но это будет не очень весело, и код может быстро стать очень уродливым, поэтому я бы не советовал.

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

Помните, что выбор одной записи из базы данных будет стоить больше времени, чем обновление этой записи, поэтому обновление одного свойства или одиннадцати в целом не будет иметь большого значения. Отслеживание одного объекта / объекта может иметь смысл, но это очень сильно зависит от приложения, его использования и количества времени, которое вы готовы потратить.

0 голосов
/ 23 декабря 2010

Для данной модели данных вы можете установить упомянутый флаг IsDirty.В большинстве случаев это достаточно хорошо.Но если по какой-то причине вы хотите иметь это для каждого уровня свойства, то вы можете использовать флаг IsDirty (например, битовый флаг, а не флаг bool).В любом случае издержки будут выполняться где-то в вашей модели данных (базе) ... поэтому общая логика будет обрабатывать все эти накладные расходы для вас (напишите один раз и используйте везде автоматически).

Другой подход заключается в том, чтобы иметь 2-ю копию для каждой модели данных, которую вы создаете (резервная копия, содержащая исходные значения).Тогда вы можете проверить это.

Я бы действительно учел это, только если время ввода-вывода в базу данных требуется быстрее, чем то, что вы видите.Если ваша модель данных обладает целым набором свойств, то это может быть хорошей идеей.В противном случае, вероятно, не стоит тратить время на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...