Convertir valor al mapear

Estoy usando EF Code-First en un método de base de datos existente y tengo un campo IsActive en mi base de datos. El problema es que el campo es VARCHAR cuando debería ser un boolean . No puedo cambiar el esquema de la base de datos.

El valor de ejemplo en la base de datos es “Y” (verdadero) o “N” (falso)

Al mapear, quiero convertir esos valores a verdadero / falso y mantener mi clase Entity con el valor booleano .

es posible?

Mis clases de entidad y mapeo son las siguientes, pero me gustaría cambiar el campo IsActive para que sea 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"); } } 

EDITAR: No encontré otra solución que esta: https://stackoverflow.com/a/6709186/1053611

Como han señalado otros, necesita dos propiedades, pero puede interesarle saber que puede hacer que una de las propiedades sea privada y aún así asignarla a la base de datos:

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

Si usa EF6, puede usar una convención personalizada en el método OnModelCreating para mapear la propiedad privada

 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"); }); 

Referencias

Mapeo de propiedades privadas usando convenciones personalizadas

Asignación de propiedades privadas sin convenciones personalizadas (antes de EF6)

Editar:

Aquí hay otra forma de identificar las propiedades privadas que deberían asignarse a la base de datos:

Primero agregue el atributo de columna a la propiedad privada:

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

A continuación, utilice la presencia de ese atributo para identificar las propiedades privadas en su método 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); }); 

Referencia: mapeo de una propiedad privada con marco de entidad

Tengo una solución para mapear realmente el tipo, lo que significa que no se requieren propiedades adicionales. Como tenía una pregunta similar para DateTimes, pero fácilmente convertible para bools:

¿Existe una forma simple de usar anotaciones de datos o un tipo personalizado para usar un valor almacenado como una cadena en SQL como DateTime en EF?