У меня небольшая проблема с 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();
}