我已在codeplex http://entityframework.codeplex.com/workitem/2087上发布了我的问题 这里也有一些问题,但没有成功回答。
见
Mapping TPT in EF Code First 4.1 w/ Different Primary Keys
How can I use TPT inheritance models when primary keys have different names?
使用TPT时,现在是否可以为主键设置不同的列名? 可能是6.1.0
答案 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");
}