2013-08-16 18 views
1

Допустим, у меня есть несколько классов:Базовый класс в качестве внешнего ключа в Entity Framework Code First

public class BaseModel 
{ 
    [Key] 
    public int Id { get; set; } 
} 

public class Person : BaseModel 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public DateTime DateOfBirth { get; set; } 

    public string Email { get; set; } 
} 

public class Employee : Person 
{ 
    public string Position { get; set; } 

    public decimal Wage { get; set; } 

    public PaymentType PaymentType { get; set; } 

    public virtual Company Company { get; set; } 
} 

В настоящее время у меня есть это:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Employee>().HasRequired(e => e.PaymentType); 
    modelBuilder.Entity<Employee>().Map(t => 
     { 
      t.MapInheritedProperties(); 
      t.ToTable("Employees"); 
     }); 

    modelBuilder.Entity<Company>().HasMany(c => c.Employees).WithRequired(e => e.Company).Map(t => t.MapKey("Company_Id")); 

} 

Я получаю две таблицы для лица и работника, но я не нравится то, что MapInheritedProperties(), добавив свойства Person в таблицу Employee.

Как сделать базовый класс (Person) внешним ключом?

ответ

0

Для использования базового класса в качестве ключевого/навигационного имущества без первичных ключей. Вы должны использовать таблицу для каждого типа или таблицы для иерархии.

В вашем случае использование этой моделиBuilder должно это сделать.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    base.OnModelCreating(modelBuilder); 

    modelBuilder.Entity<Employee>().HasRequired(e => e.PaymentType); 
    modelBuilder.Entity<Person >().ToTable("Persons"); 
    modelBuilder.Entity<Employee>().ToTable("Employees"); 

    modelBuilder.Entity<Company>().HasMany(c => c.Employees).WithRequired(e => e.Company).Map(t => t.MapKey("Company_Id")); 
} 

Эта таблица будет создана. По именам Лица будут все поля для человека и один «Сотрудники» для всех полей для сотрудника. Обе таблицы будут иметь один и тот же первичный ключ

Подробное разъяснение можно получить на Mortenza Manavi's blog