![](/img/trans.png)
[英]Entity Framework Core DbContext.SaveChanges throws System.InvalidCastException: Unable to cast object of type System.Boolean to type System.Int16
[英]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.