web-dev-qa-db-ja.com

マッピング時に値を変換

既存のデータベースに対して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

35
Gaui

他の人が指摘したように、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);
});

参照: プライベートプロパティとエンティティフレームワークのマッピング

42
Colin

here で説明されている値変換を使用しない理由

0
melmi