簡體   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