Подтвердить что ты не робот

Преобразование значения при сопоставлении

Я использую 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");
    }
}

EDIT: Я не нашел другого решения, кроме этого: qaru.site/info/165439/...

4b9b3361

Ответ 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)

Edit:

Здесь другой способ идентификации частных свойств, которые должны быть сопоставлены с базой данных:

Сначала добавьте атрибут столбца в частное свойство:

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

Ссылка: Сопоставление частного свойства с инфраструктурой сущности