I'm using EF Code-First to an existing database method and have a IsActive
field in my database. The problem is that the field is VARCHAR
when it should be a boolean
. I can't change the Database schema.
Example value in the database are "Y" (true) or "N" (false)
When mapping, I want to convert those values to either true/false and keep my Entity class with the boolean value.
Is this possible?
My Entity and mapping classes are the following but I would like to change the IsActive
field to be a boolean.
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<Employee> { 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: I found no other solution than this: https://stackoverflow.com/a/6709186/1053611
As others have pointed out you need two properties, but you may be interested to know that you can make one of the properties private and still map it to the database:
private string isActive { get; set; } [System.ComponentModel.DataAnnotations.Schema.NotMapped] public bool IsActive { get { return isActive == "Y"; } set { isActive = value ? "Y" : "N"; } }
If you are using EF6 you can use a custom convention in the OnModelCreating
method to map the private property
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"); });
References:
Mapping private properties using custom conventions
Mapping private properties without custom conventions (before EF6)
Edit:
Here's another way of identifying the private properties that should be mapped to the database:
First add the column attribute to the private property:
[System.ComponentModel.DataAnnotations.Schema.Column] private string isActive { get; set; }
Then use the presence of that attribute to identify private properties in your OnModelCreating
method:
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); });
Reference: Mapping a private property with entity framework
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With