2015-04-06 3 views
0

Я использую Entity Framework 6.0 с наследованием Code First и Table for Hierarchy (TPH).Код структуры Entity Framework Первый разделитель TPH Столбец

Смотрите следующий MWE (я опускаю другие операторы свободно API уточнить, где проблема):

public abstract class Employee 
{ 
    public int EmployeeId { get; set; } 
    public string Type { get; set; }   
} 

public class CEO : Employee 
{ 
    public CEO() {Type = 1} 
} 

public class Other : Employee 
{ 

} 

public class InheritanceMappingContext : DbContext 
{ 
    public DbSet<Employee> Employees { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Employee>() 
       .Map<CEO>(m => m.Requires("Type").HasValue(1)) 
       .Map<Other>(m => m.Requires("Type").HasValue(**<>1**)); 
    } 
} 

Я хотел бы отобразить все записи, которые имеют 1 для столбца Type (который должен быть столбец дискриминатора) к классу CEO. Все записи с позицией, отличной от 1 для столбца Type, должны быть сопоставлены классу Other.

Здесь возникают две проблемы. Первый способ - написать .HasValue(**<>1**)); в качестве правильного кода. Во-вторых, я хочу использовать столбец Type в своем коде, но поскольку это столбец дискриминатора, у меня нет доступа к нему.

ответ

2

Я не верю, что для сопоставления можно использовать не логику, и я вполне уверен, что доступ к столбцу дискриминатора как свойства в вашем классе невозможно.

Кроме того, я думаю, что концептуально существует проблема, а именно, наследование ООП действительно применимо к этой ситуации? В классах-близнецах ООП нельзя отбросить боковую сторону в иерархию наследования, только вверх и вниз, например, яблоко можно отбросить на плод, но яблоко не может быть брошено на оранжевый. В вашем примере сотрудник типа «Другое» может однажды (с некоторым удачей) стать генеральным директором. Это небольшая проблема, и вряд ли она возникнет, и ее можно обойти, если исправить SQL напрямую (уродливо), но это указывает на то, что наследование не является правильным решением вашей проблемы.

+0

Благодарим вас, хороший момент о наследовании. Я изменил концепцию на один класс Employee с атрибутом 'Type' как дискриминатором внутри кода, но только с одной таблицей и без столбца дискриминатора. – user2653422

Смежные вопросы