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"));

}

我为 Person 和 Employee 获得了两个表,但我不喜欢MapInheritedProperties()通过将 Person 属性添加到 Employee 表中所做的事情。

如何使基类(Person)成为外键?

4

1 回答 1

1

为了使用基类作为外键/导航属性而没有主键问题。您需要使用每个类型的表或每个层次结构的表。

在您的情况下,使用该模型构建器应该这样做。

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"));
}

将创建这两个表。在名称上,Persons 将一个人的所有字段和一个“员工”用于员工的所有字段。两个表将共享相同的主键

您可以在Mortenza Manavi 的博客上获得非常详细的解释

于 2013-08-16T15:13:44.347 回答