既存のデータベースに対してEF Code-Firstメソッドを使用しており、データベースにIsActive
フィールドがあります。問題は、フィールドがVARCHAR
であるべきときにboolean
であるということです。データベーススキーマを変更できません。
データベースの値の例は、「Y」(true)または「N」(false)です。
マッピングするとき、これらの値をtrue/falseに変換し、Entityクラスをboolean valueのままにします。
これは可能ですか?
エンティティクラスとマッピングクラスは次のとおりですが、IsActive
フィールドをブール値に変更したいと思います。
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:これ以外の解決策は見つかりませんでした: https://stackoverflow.com/a/6709186/1053611
他の人が指摘したように、2つのプロパティが必要ですが、プロパティの1つをプライベートにしてデータベースにマップできることを知りたい場合があります。
private string isActive { get; set; }
[System.ComponentModel.DataAnnotations.Schema.NotMapped]
public bool IsActive
{
get { return isActive == "Y"; }
set { isActive = value ? "Y" : "N"; }
}
EF6を使用している場合、OnModelCreating
メソッドでカスタム規則を使用してプライベートプロパティをマップできます。
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");
});
参照:
カスタム規則を使用してプライベートプロパティをマッピングする
カスタム規則なしでプライベートプロパティをマッピングする(EF6より前)
編集:
データベースにマッピングする必要があるプライベートプロパティを識別する別の方法を次に示します。
最初に列属性をプライベートプロパティに追加します。
[System.ComponentModel.DataAnnotations.Schema.Column]
private string isActive { get; set; }
次に、その属性の存在を使用して、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);
});
here で説明されている値変換を使用しない理由