Converti valore durante la mapping

Sto usando EF Code-First su un metodo di database esistente e ho un campo IsActive nel mio database. Il problema è che il campo è VARCHAR quando dovrebbe essere un boolean . Non riesco a modificare lo schema del database.

I valori di esempio nel database sono “Y” (true) o “N” (false)

Durante la mapping, voglio convertire quei valori in true / false e mantenere la mia class Entity con il valore booleano .

È ansible?

Le mie quadro e le classi di mapping sono le seguenti, ma vorrei modificare il campo IsActive come booleano.

 public class Employee { public int ID { get; set; } public string SSN { get; set; } public string Email { get; set; } public string IsActive { get; set; } } public class EmployeeMap : EntityTypeConfiguration { public EmployeeMap() { this.ToTable("Employees"); this.HasKey(t => t.ID); this.Property(t => t.ID).HasColumnName("ID_Employee"); this.Property(t => t.SSN).HasColumnName("sReference"); this.Property(t => t.Email).HasColumnName("Email"); this.Property(t => t.IsActive).HasColumnName("IsActive"); } } 

EDIT: non ho trovato altra soluzione di questo: https://stackoverflow.com/a/6709186/1053611

Come altri hanno sottolineato, hai bisogno di due proprietà, ma potresti essere interessato a sapere che puoi rendere privata una delle proprietà e comunque associarla al database:

  private string isActive { get; set; } [System.ComponentModel.DataAnnotations.Schema.NotMapped] public bool IsActive { get { return isActive == "Y"; } set { isActive = value ? "Y" : "N"; } } 

Se si utilizza EF6, è ansible utilizzare una convenzione personalizzata nel metodo OnModelCreating per mappare la proprietà privata

 modelBuilder.Types().Configure(c => { //NB the syntax used here will do this for all entities with a //private isActive property var properties = c.ClrType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance) .Where(p => p.Name == "isActive"); foreach (var p in properties) c.Property(p).HasColumnName("IsActive"); }); 

Riferimenti:

Associazione di proprietà private tramite convenzioni personalizzate

Mappatura di proprietà private senza convenzioni personalizzate (prima di EF6)

Modificare:

Ecco un altro modo di identificare le proprietà private che dovrebbero essere mappate al database:

Innanzitutto aggiungi l’attributo della colonna alla proprietà privata:

 [System.ComponentModel.DataAnnotations.Schema.Column] private string isActive { get; set; } 

Quindi utilizza la presenza di tale attributo per identificare proprietà private nel tuo metodo OnModelCreating :

 modelBuilder.Types().Configure(c => { var properties = c.ClrType .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance) .Where(propInfo => propInfo.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0); foreach (var p in properties) c.Property(p).HasColumnName(p.Name); }); 

Riferimento: mapping di una proprietà privata con framework di entity framework

Ho una soluzione per mappare effettivamente il tipo che significa che non sono richieste proprietà aggiuntive. Come ho avuto una domanda simile per DateTimes, ma facilmente convertibile per bool:

C’è un modo semplice usando le annotazioni di dati o un tipo personalizzato per usare un valore memorizzato come stringa in SQL come DateTime in EF?