【问题标题】:Base class as foreign key in Entity Framework Code First基类作为实体框架代码优先中的外键
【发布时间】:2023-03-19 05:45:01
【问题描述】:

假设我有一些课程:

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)成为外键?

【问题讨论】:

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


    【解决方案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's blog得到非常详细的解释

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 2012-05-10
      • 2015-02-24
      • 2021-01-05
      • 2011-08-05
      相关资源
      最近更新 更多