Ho un po 'di problemi con il mio core EF sulla conversione del valore da bool a int.
Lo sfondo è che sto usando DB2 di IBM come mio database e le versioni precedenti non supportano il tipo BIT, quindi devo usare qualcos'altro per simulare un booleano. Nel mio caso non volevo usare 1 e 0.
Voglio farlo con EF Core Value Conversion. La mia classe di Convertitore:
var myconverter = new ValueConverter<bool, int>(x => x ? 1 : 0, x => x == 1);
builder.Entity<ApplicationUser>(b => {
b.Property(p => p.EmailConfirmed).HasConversion(myconverter);
});
Quindi, il booleano è il mio tipo di modello (TModel) e il tipo di database int (TProvider).
Dopo aver eseguito questa semplice riga di codice:
var user = identityContext.Users.First();
Ottengo l'errore:
InvalidCastException: impossibile eseguire il cast dell'oggetto di tipo 'System.Int32' per digitare 'System.Boolean'.
E non ho idea del perché. Un inserto funziona bene e la trama è memorizzata con il valore corretto (1/0) ma la parte selezionata si rompe.
L'uso della classe incorporata BoolToZeroOneConverter<int>
produce lo stesso errore.
EF Core è fino a 2.1.1
Mi sto perdendo qualcosa? Grazie per l'aiuto.
UPDATE ApplicationUser eredita "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();
}
Abbiamo avuto lo stesso problema e l'unica cosa che ha funzionato è stata disabilitare la conversione del valore e creare le nostre proprietà con lo stesso nome ma il tipo previsto, il compilatore lancia un avvertimento ma era l'unico modo in cui l'abbiamo fatto funzionare.
public class ApplicationUser : IdentityUser {
//Hack: Used as a workaround with DB2's data types
public int LockoutEnabled { get; set; }
public int EmailConfirmed { get; set; }
}