Dapper UpdateAsync игнорирует столбец
Я пытаюсь выполнить обновление с помощью Dapper.Contrib этой таблицы:
public class MyTable
{
public int ID { get; set; }
public int SomeColumn1 { get; set; }
public int SomeColumn2 { get; set; }
public int CreateUserID { get; set; }
public int UpdateUserID { get; set; }
}
Я не хочу обновлять столбец CreateUserID, потому что это метод обновления, поэтому я хочу игнорировать этот столбец при вызове метода Dapper - Update.Async(entity).
Я пытался использовать атрибуты [NotMapped] и [UpdateIgnore], но без помощи.
Примечание. Я все еще хочу, чтобы этот столбец передавался в операциях вставки, поэтому [Computed] и [Write (false)] не подходят.
Может кто-нибудь помочь мне разобраться, как игнорировать этот столбец при обновлении таблицы в базе данных?
Ответы
Ответ 1
Ну, это просто не поддерживается. Вот ссылка issue, и решение ожидается только в Dapper v2. Вы также можете проверить исходный код (это довольно просто) и посмотреть, что обновленные свойства выполняются следующим образом:
var allProperties = TypePropertiesCache(type);
keyProperties.AddRange(explicitKeyProperties);
var computedProperties = ComputedPropertiesCache(type);
var nonIdProps = allProperties.Except(keyProperties.Union(computedProperties)).ToList();
Таким образом, все свойства, не отмеченные ключом \ExplicitKey\Computed и которые доступны для записи, включены. То же самое происходит и для InsertAsync
(кроме свойств с ExplicitKey
также включены в insert, но вы не можете использовать этот атрибут в своем situtaion, потому что ваше свойство не является ключевым в конце).
Итак, вам нужно либо дождаться, когда это будет реализовано, так и реализовано самостоятельно, или просто напишите свой собственный метод UpdateAsync
. Из исходного кода вы можете видеть, что это очень просто и не сложно переопределить.
Ответ 2
Как уже упоминалось в его ответе @Evk, решения пока нет. Он также упомянул об обходных решениях.
Кроме того, вы можете использовать Dapper (IDbConnection.Execute(...)
) непосредственно в обход Dapper.Contrib для этого конкретного случая.
У меня была аналогичная проблема (с DapperExtensions хотя) с конкретным обновлением столбца и другими сложными запросами, которые DapperExtensions либо не могут генерировать вообще, либо нуждаются в большой работе, чтобы сделать это с ней.
Я использовал Dapper непосредственно вместо DapperExtensions для этого конкретного случая; другая часть проекта по-прежнему пользуется DapperExtensions. Это похоже на стук. Такие случаи очень ограничены. Я нашел, что это лучшее решение вместо настройки/форсирования DapperExtensions для этого. Это также спасло меня вовремя и усилий.
Ответ 3
Я предлагаю использовать атрибут [Computed]
.
[Computed]
- это свойство вычисляется и не должно быть частью обновлений.
Но, похоже, что документация для Dapper.Contrib сформулирована в замешательстве. Атрибут [Computed]
также игнорируется на вставках - это может или не может работать для вашего варианта использования.