![](/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.