Поделиться через


Ограничения Dapper

При использовании Microsoft.Data.SQLite с Dapper необходимо учитывать ряд ограничений.

Параметры

В именах параметров SQLite учитывается регистр букв. Убедитесь, что имена параметров, используемые в SQL, соответствуют регистру свойств анонимного объекта. Обратите внимание на проблему #18861, чтобы упростить себе работу.

Dapper также ожидает от параметров использования префикса @. Другие префиксы работать не будут.

var result = connection.ExecuteScalar(
    "SELECT @Value",
    new { Value = 1 });

Типы данных

Dapper считывает значения с помощью индексатора SqliteDataReader. Тип возвращаемого значения этого индексатора — object, то есть он будет возвращать только значения long, double, string или byte[]. Дополнительные сведения см. в разделе Типы данных. Dapper обрабатывает большинство преобразований между этими и прочими примитивными типами. К сожалению, он не может обрабатывать DateTimeOffset, Guidили TimeSpan. Создавайте обработчики типов, если эти типы нужно включать в результаты.

abstract class SqliteTypeHandler<T> : SqlMapper.TypeHandler<T>
{
    // Parameters are converted by Microsoft.Data.Sqlite
    public override void SetValue(IDbDataParameter parameter, T? value)
        => parameter.Value = value;
}

class DateTimeOffsetHandler : SqliteTypeHandler<DateTimeOffset>
{
    public override DateTimeOffset Parse(object value)
        => DateTimeOffset.Parse((string)value);
}

class GuidHandler : SqliteTypeHandler<Guid>
{
    public override Guid Parse(object value)
        => Guid.Parse((string)value);
}

class TimeSpanHandler : SqliteTypeHandler<TimeSpan>
{
    public override TimeSpan Parse(object value)
        => TimeSpan.Parse((string)value);
}

Не забудьте добавить обработчики типов перед выполнением запроса.

SqlMapper.AddTypeHandler(new DateTimeOffsetHandler());
SqlMapper.AddTypeHandler(new GuidHandler());
SqlMapper.AddTypeHandler(new TimeSpanHandler());

См. также