映射时转换值

时间:2013-10-14 22:09:43

标签: entity-framework asp.net-mvc-4

我正在使用 EF Code-First到现有数据库方法,并在我的数据库中有一个IsActive字段。问题是该字段为VARCHAR时应为boolean。我无法更改数据库架构。

数据库中的示例值为“Y”(true)或“N”(false)

映射时,我想将这些值转换为true / false,并使用布尔值保留我的Entity类。

这可能吗?

我的实体和映射类如下,但我想将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");
    }
}

编辑:我找不到其他解决方案:https://stackoverflow.com/a/6709186/1053611

2 个答案:

答案 0 :(得分:41)

正如其他人指出您需要两个属性,但您可能有兴趣知道您可以将其中一个属性设为私有并仍将其映射到数据库:

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

参考文献:

Mapping private properties using custom conventions

Mapping private properties without custom conventions (before EF6)

修改

这是识别应该映射到数据库的私有属性的另一种方法:

首先将column属性添加到私有属性:

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

参考:Mapping a private property with entity framework

答案 1 :(得分:-1)

我有一个解决方案,可以实际映射类型,这意味着不需要其他属性。由于我对DateTimes有类似的问题,但可以轻松转换为bool:

Is there a simple way using data annotations or a custom type to use a value stored as a string in SQL as a DateTime in EF?