Entity Framework Core / Value Преобразование "InvalidCastException" логическое значение в int - PullRequest
0 голосов
/ 07 сентября 2018

У меня небольшая проблема с EF Core по поводу преобразования значения из bool в int.

Исходная информация заключается в том, что я использую DB2 IBM в качестве своей базы данных, а более старые версии не поддерживают тип BIT, поэтому мне нужно использовать что-то другое для имитации логического значения. В моем случае я просто не хочу использовать 1 и 0.

Я хочу сделать это с помощью EF Core Value Conversion. Мой конвертер класса:

var myconverter = new ValueConverter<bool, int>(x => x ? 1 : 0, x => x == 1);
builder.Entity<ApplicationUser>(b => {
      b.Property(p => p.EmailConfirmed).HasConversion(myconverter);
});

Итак, логическое значение - это мой тип модели (TModel) и int тип базы данных (TProvider).

После выполнения этой простой строки кода:

var user = identityContext.Users.First();

Я получаю ошибку:

InvalidCastException: невозможно преобразовать объект типа «System.Int32» в тип «System.Boolean».

И я понятия не имею, почему. Вставка работает нормально, и свойство хранится с правильным значением (1/0), но выбранная часть ломается.

Использование встроенного класса BoolToZeroOneConverter<int> приводит к той же ошибке.

EF Core до 2.1.1

Я что-то упустил? Спасибо за вашу помощь.

UPDATE ApplicationUser наследует "IdentityUser"

public class IdentityUser<TKey> where TKey : IEquatable<TKey>
{

    public IdentityUser();

    public IdentityUser(string userName);

    public virtual DateTimeOffset? LockoutEnd { get; set; }

    [PersonalData]
    public virtual bool TwoFactorEnabled { get; set; }

    [PersonalData]
    public virtual bool PhoneNumberConfirmed { get; set; }

    [ProtectedPersonalData]
    public virtual string PhoneNumber { get; set; }

    public virtual string ConcurrencyStamp { get; set; }

    public virtual string SecurityStamp { get; set; }

    public virtual string PasswordHash { get; set; }

    [PersonalData]
    public virtual bool EmailConfirmed { get; set; }

    public virtual string NormalizedEmail { get; set; }

    [ProtectedPersonalData]
    public virtual string Email { get; set; }

    public virtual string NormalizedUserName { get; set; }

    [ProtectedPersonalData]
    public virtual string UserName { get; set; }

    [PersonalData]
    public virtual TKey Id { get; set; }

    public virtual bool LockoutEnabled { get; set; }

    public virtual int AccessFailedCount { get; set; }

    public override string ToString();
}

1 Ответ

0 голосов
/ 25 октября 2018

У нас была та же проблема, и единственное, что сработало, было отключить преобразование значений и создать наши собственные свойства с тем же именем, но с ожидаемым типом, компилятор выдает предупреждение, но это был единственный способ заставить его работать .

public class ApplicationUser : IdentityUser {

    //Hack: Used as a workaround with DB2's data types
    public int LockoutEnabled { get; set; }
    public int EmailConfirmed { get; set; }

}
...