代码优先:TPT继承 - 为每个表中的主键列指定不同的名称

时间:2014-02-15 22:09:34

标签: entity-framework inheritance ef-code-first

3 个答案:

答案 0 :(得分:0)

在TPT中,你基本上不想在子类中声明键,否则你会错过这一点。
如果必须具有不同的Id名称,只需在子类中将代理属性映射到基本Id。

public class BaseEntity
{
  public int Id { get; set; }    
}

public abstract class SubEntity : BaseEntity
{
  public BaseId
  {
    get => Id;
    set => Id = value;
  }
} 

考虑将子字段标记为NotMapped,以防您不应将它们包含在LINQ查询中。

答案 1 :(得分:0)

使用EF 6.4,我能够使用ColumnAttribute重命名相关类中的Primary Key列

[Table("Person")]
public class Person
{
    [Key]
    public virtual int PersonId { get; set; }

    // Person atributes...
}

[Table("Employee")]
public class Employee : Person
{
    [Column("EmployeeId")] // <- Name of the primary Key column in the Database
    public override int PersonId { get; set }

    // Employee Attributes

}

答案 2 :(得分:-1)

看看这段代码片段。它的工作对我来说是正确的:

public partial class Person
{
    // Any other PK name can thrown an exception
    public int ID { get; set; }
}

public partial class Employee : Person
{
    // Hide base class ID
    private new int ID { get; set }

    // Define derived class ID (that wrapped inherited ID)
    [NotMapped]
    public int EmployeeID
    {
        get { return base.PersonID; }
        set { base.PersonID = value; }
    }
}

现在,我们必须为数据库表重命名继承的ID(使用流畅的API):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
        .Property(e => e.ID)
        .HasColumnName("EmployeeID");
}