2015-04-27 143 views
2

如何映射繼承實體我試圖到AdventureWorks 2012示例數據庫映射到EF 6.1.3代碼第一數據層,和我停留在如何將EmployeePerson實體映射。員工顯然應該從Person派生,Person.PersonTypeEM,但我不知道如何使用EntityTypeConfiguration<TEntity>'映射'類來映射它。知道這一點,我也可以映射Person派生自BusinessEntity在EF代碼優先

+0

員工應該獲得人,你必須給他們相同的PK(讓員工使用繼承的PersonID密鑰)。 EF將正確映射它們。 –

+0

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-con-crete-type-tpc-and-choosing-strategy - 指引和相關帖子 –

回答

0

我將解釋如何執行Employee和使用代碼優先方法的Person表之間的映射,可以按照相同的步驟BusinessEntityPerson之間進行映射繼承。

使用的繼承映射策略是TPT(Table Per Type),我創建了一個簡單的控制檯應用程序,安裝了AdventureWorks2012數據庫後,我跟着EF DataModel嚮導生成了我將修改爲映射的代碼第一類繼承,因此,這裏的結果代碼:

Person類:

public partial class Person 
{ 
    [Key] 
    public int BusinessEntityID { get; set; } 

    [Required] 
    public string PersonType { get; set; } 

    public bool NameStyle { get; set; } 

    public string Title { get; set; } 

    [Required] 
    public string FirstName { get; set; } 

    public string MiddleName { get; set; } 

    [Required] 
    public string LastName { get; set; } 

    public string Suffix { get; set; } 

    public int EmailPromotion { get; set; } 

    [Column(TypeName = "xml")] 
    public string AdditionalContactInfo { get; set; } 

    [Column(TypeName = "xml")] 
    public string Demographics { get; set; } 

} 

Employee類:

public partial class Employee: Person 
{ 

    [Required] 
    public string NationalIDNumber { get; set; } 

    [Required] 
    public string LoginID { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public short? OrganizationLevel { get; set; } 

    [Required] 
    public string JobTitle { get; set; } 

    [Column(TypeName = "date")] 
    public DateTime BirthDate { get; set; } 

    [Required] 
    public string MaritalStatus { get; set; } 

    [Required] 
    public string Gender { get; set; } 

    [Column(TypeName = "date")] 
    public DateTime HireDate { get; set; } 

    public bool SalariedFlag { get; set; } 

    public short VacationHours { get; set; } 

    public short SickLeaveHours { get; set; } 

    public bool CurrentFlag { get; set; } 

    public Guid rowguid { get; set; } 

    public DateTime ModifiedDate { get; set; } 
} 

最後的AW上下文類:

public partial class AW : DbContext 
{ 
    public AW() 
     : base("name=AWConnectionString") 
    { 
    } 

    public virtual DbSet<Employee> Employees { get; set; } 

    public virtual DbSet<Person> People { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {    
     modelBuilder.Entity<Person>().ToTable("Person.Person"); 
     modelBuilder.Entity<Employee>().ToTable("HumanResources.Employee"); 
    } 
} 

一個簡單的測試(這對我的作品;)):

class Program 
{ 
    static void Main(string[] args) 
    { 
     using(var db= new AW()) 
     { 
      var e = db.Employees.First(); 
      e.JobTitle = "Web Developper"; 
      db.SaveChanges(); 
     } 
    } 
} 

您可以參考this文章瞭解更多詳細信息,

+0

我在這裏沒有看到的一件事是如何告訴EF'PersonType'是一個'區分器'列。我們可以簡單地在'Employee'中設置值'EM',但我不知何故認爲映射的這個方面還有更多。 'differentiator'指的是 – ProfK

+0

,您指的是TPH繼承策略中使用的'descriminator'。我沒有在上面指定一個鑑別器,因爲我用TPT來映射入射。 –

+0

是的,這是我一直在尋找的術語。所以我想在這裏我們只能使用'Employee'的ctor來設置它。 – ProfK