繁体   English   中英

实体框架核心/值转换“ InvalidCastException”布尔值转换为整数

[英]Entity Framework Core / Value Conversion “InvalidCastException” boolean to int

我的EF Core在将值从bool转换为int时遇到了一些麻烦。

背景是我使用IBM的DB2作为数据库,而较早的版本不支持BIT类型,因此我必须使用其他方法来模拟布尔值。 就我而言,我只是不想使用1和0。

我想通过EF核心价值转换来做到这一点。 我的转换器类:

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();
}

我们遇到了同样的问题,唯一可行的方法是禁用值转换,并使用相同的名称但期望的类型创建我们自己的属性,编译器将发出警告,但这是我们使之起作用的唯一方法。

public class ApplicationUser : IdentityUser {

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM