2013-08-16 40 views
1

外鍵可以說我有一些類:基類中的實體框架代碼優先

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

爲了使用基類作爲主鍵/導航屬性沒有主鍵問題。你需要使用Table per Type或Table per Hierarchy。

在你的情況下,使用該模型構建器應該這樣做。

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