Почему добавлять в Dapper «Отслеживание изменений полей» - хорошая или плохая идея? - PullRequest
2 голосов
/ 04 августа 2020

Мы используем Dapper и Dapper.Contrib в нашем приложении. Мы выбрали Dapper, потому что он быстрее, а скорость - все для нас из-за большой нагрузки. И теперь кажется, что «Отслеживание изменений полей» нам жизненно необходимо. А пока Dapper.Contrib создает запрос update, который всегда устанавливает все поля, и такие запросы делают их медленнее. В некоторых таблицах сейчас ~ 30 столбцов, и полное обновление строк в этих таблицах очень неэффективно.

Как я вижу, Dapper.Contrib имеет Change tracking per object, но Change tracking per field не добавлен в библиотеку.

Я провел очень тщательное исследование и обнаружил, что в этой области не ведется никакой работы. Это неудачное исследование сбило меня с толку. Хотелось бы услышать ваши мысли:

  1. Если такое расширение не реализовано, может быть, оно бесполезно? Что мне здесь не хватает?
  2. Пожалуйста, поставьте себя на мое место. Что бы вы сделали? Перейдите в EF или введите «Отслеживание изменений» в Dapper.Contrib?
  3. Может ли добавление такой функции замедлить работу Dapper, и поэтому эта функция еще не реализована?

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Попробовать dapper raw sql или хранимую процедуру вместо использования Contrib update? Просто посмотрите, работает ли raw sql / хранимая процедура быстрее или нет. Если это быстрее, чем обновление contrib, думаю, вам нужно использовать необработанную sql / хранимую процедуру, если вас беспокоит производительность.

На вашем месте я бы переключился на EF Core. Это намного быстрее и короче.

0 голосов
/ 04 августа 2020

Dapper.Contrib может отслеживать изменения, если вы используете методы Get и Update и передаете Update тот же объект (после внесения в него изменений), который вы получили с помощью Get.

Отслеживание изменений в каждом поле не имеет значения. Измените одно поле, и вам все равно придется записывать всю запись.

Если вы действительно хотите изменить только одно поле (или два ...), не неся затрат на запись всей записи, вам нужно сделать это:

conn.Execute(
    @"UPDATE MyTable SET MyField=@myParameter WHERE ID = @id",
    new { myParameter = myNewValue, id=myID });

Примечание: вы можете найти поддержку для отслеживания изменений для каждого поля здесь . Этого нет в Dapper, потому что:

Это не то направление, в котором мы хотим go с Dapper. Если вам нужно полное отслеживание изменений или обновления для объектов, я бы порекомендовал один из ORM, который принимает эти дополнительные расходы, связанные с отслеживанием изменений, например Entity Framework. Это просто не то, что нам нужно в основной библиотеке Dapper. - Ник Крейвер

...