2015-04-27 145 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