Как исправить ошибку DapperExtensions после того, как я вставил данные и получил возвращенный идентификатор - PullRequest
1 голос
/ 17 мая 2019

Я использую Dapper-Extentions для извлечения и передачи данных в базу данных

Я использую unsigned int id в качестве моего первичного ключа в базе данных , а также в классе . мой класс выглядит так

public class Product {
    [Column("id")]
    public uint Id { get; set; }
}

Мой класс Mapper выглядит следующим образом

public class ProductMap : ClassMapper<Product>
{
    public ProductMap()
    {
        Table("Product");                    
        this.Map(typeof(Product).GetProperty("Id")).Key(KeyType.Identity);
    }
}

Я вставляю данные вот так

using DapperExtensions;

public virtual uint Add(T item)
{
    using (conn)
    {
        return Convert.ToUInt32(conn.Insert<T>(item)); // System.ArgumentException: 'Object of type 'System.Int32' cannot be converted to type 'System.UInt32'.'`
    }
}

Когда я вставляю данные в базу данных, элемент вставляется в базу данных без проблем, однако функция Вставка продолжает возвращать следующую ошибку:

'Объект типа' System.Int32 'не может быть преобразован в тип 'System.UInt32'. '

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Как вы сказали, операция INSERT происходит нормально. Затем Dapper Extensions извлекает вновь сгенерированное значение идентификатора и пытается присвоить его свойству Product.Id.

Теперь тип возвращаемого значения (значение столбца) - int со знаком. Тип данных свойства Id - uint, который не подписан. Хотя длина обоих типов данных одинакова, тип данных (подписанных и неподписанных), которые они могут содержать, различен, и, следовательно, ошибка.

Вам следует изменить тип данных вашего свойства Id на int, как показано ниже:

public int Id { get; set; }

Как вы сказали в своем ответе, вы должны сохранить собственность uint, вот что я предлагаю:

Добавьте дополнительное свойство в свой класс, как держатель / копию, как показано ниже:

public class Product {
    [Column("id")]
    public int Id { get; set; }//Map this as Identity.

    public uint IdCopy { get { return Convert.ToUInt32(Id); } }//Readonly; Exclude this from mapping
}
0 голосов
/ 22 мая 2019

Мне действительно нужно было сохранить свои идентификаторы данных как uint, и я нашел решение для этой int32 в uint ошибки преобразования.

В DapperImplementor.cs classвнутри функции public dynamic Insert<T> {...}

Существует переменная int identityInt = 0;, используемая для хранения идентификатора перед присвоением его соответствующему идентификатору объекта

Проблема была решена после того, как я изменил ее тип на uint identityInt = 0;

...