Подтвердить что ты не робот

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)] не подходят.

Может кто-нибудь помочь мне разобраться, как игнорировать этот столбец при обновлении таблицы в базе данных?

4b9b3361

Ответ 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] также игнорируется на вставках - это может или не может работать для вашего варианта использования.