【发布时间】: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<int>会导致同样的错误。
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