【问题标题】:Entity Framework Core / Value Conversion "InvalidCastException" boolean to int实体框架核心/值转换“InvalidCastException”布尔到 int
【发布时间】:2018-09-06 22:05:09
【问题描述】:

关于从 bool 到 int 的值转换,我的 EF Core 有点麻烦。

背景是我使用IBM的DB2作为我的数据库,旧版本不支持BIT类型,所以我必须使用其他东西来模拟布尔值。就我而言,我只是不想使用 1 和 0。

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

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&lt;int&gt;会导致同样的错误。

EF Core 最高为 2.1.1

我错过了什么吗? 感谢您的帮助。

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

【问题讨论】:

  • 您需要为模型中的所有bool指定一个值转换器吗?
  • 是的。但我排除了很多道具,只使用 EmailConfirmed 布尔值。它在那里破裂。
  • 你能告诉我们你正在使用的其他布尔值的代码吗?
  • 没有一个布尔值起作用。我认为这是我的 ef 核心的普遍问题。
  • 最近遇到了类似的问题。使用不同的场景运行多个测试,如果 EF 使用 IBM 提供程序,则似乎永远不会调用 OnModelCreating() 中配置的 ValueConverters。使用 MS SQL 运行相同的场景 - 一切都按预期工作

标签: c# db2 entity-framework-core


【解决方案1】:

我们遇到了同样的问题,唯一有效的是禁用值转换并创建我们自己的具有相同名称但预期类型的​​属性,编译器会抛出警告,但这是我们让它工作的唯一方法.

public class ApplicationUser : IdentityUser {

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多