Как сделать так, чтобы в моем POCO изменялась обработка строк SQL Server как ulong? - PullRequest
0 голосов
/ 24 мая 2019

Я видел этот другой вопрос , который не является моей проблемой.

Я использую Dapper multi-mapping для отношений один к одному между двумя объектами. В обеих моих таблицах используются столбцы версий строк (отметка времени).

SQL-запрос, который является базовым SELECT с INNER JOIN, который я использую, возвращает байтовый массив для столбцов версии строки. Я хотел бы имитировать способность EF Core указывать преобразование полей:

// https://github.com/aspnet/EntityFrameworkCore/issues/5936#issuecomment-397987482
 entity.Property(e => e.RowVersion)
     .HasConversion(new NumberToBytesConverter<ulong>())
     .IsRowVersion();

Ошибка отображения сопоставления со следующей ошибкой:

System.Data.DataException
  HResult=0x80131501
  Message=Error parsing column 17 (RowVersion=System.Byte[] - Object)
  Source=Dapper.StrongName
  StackTrace:
   at Dapper.SqlMapper.ThrowDataException(Exception ex, Int32 index, IDataReader reader, Object value) in C:\projects\dapper\Dapper\SqlMapper.cs:line 3609
   at Dapper.SqlMapper.<>c__DisplayClass156_0`8.<GenerateMapper>b__0(IDataReader r) in C:\projects\dapper\Dapper\SqlMapper.cs:line 1542
   at Dapper.SqlMapper.<MultiMapImpl>d__153`8.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.cs:line 1444
   at System.Collections.Generic.List`1.AddEnumerable(IEnumerable`1 enumerable)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.<MultiMapAsync>d__52`8.MoveNext() in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 949
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at TestDapper.Program.<RunSQLCommand>d__17`3.MoveNext() in C:\Users\olivier.matrot\dapper\Program.cs:line 544
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at TestDapper.Program.<RunSQLCommand>d__17`3.MoveNext() in C:\Users\olivier.matrot\dapper\Program.cs:line 561
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at TestDapper.Program.<Main>d__8.MoveNext() in C:\Users\olivier.matrot\dapper\Program.cs:line 374
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at TestDapper.Program.<Main>(String[] args)

Inner Exception 1:
InvalidCastException: Object must implement IConvertible.

Я почти уверен, что сообщение Inner Exception - не тот путь, по которому можно пойти. Любая помощь приветствуется.

EDIT


Решено с помощью TypeHandler:

public class ULongTypeHandler : SqlMapper.TypeHandler<ulong>
{
    public override ulong Parse(object value)
    {
        return (ulong)new NumberToBytesConverter<ulong>().ConvertFromProvider(value);
    }

    public override void SetValue(IDbDataParameter parameter, ulong value)
    {
        throw new NotImplementedException();
    }
}

Но это применимо ко всем длинным свойствам в POCO.

...