3

codefirst 中的两个类

public partial class BaseEntity 
{
    public int ID { get; set; }
}

public partial class Fund : BaseEntity
{
   public int Name { get; set; }
}
public partial class InvestorFund : BaseEntity 
{
  public int FundID { get; set; }
}

映射类

this.Property(t => t.ID).HasColumnName("FundID");

我的代码首先加入 SQL 查询

from fund in context.Funds

join investorFund in context.InvestorFunds on fund.ID equals investorFund.FundID

抛出一个Invalid column name Discriminator

4

2 回答 2

10

您需要告诉 Code First 这些类与表的关系。有三个选项:

  • 每个类型的表 (TPT)意味着在 Fund 和 InvestorFund 上定义的字段将进入它们自己的表,在 BaseEntity 上定义的属性将进入名为 BaseEntity 的表。查询会更慢,因为每个实体现在必须组合来自多个表的字段。

    modelBuilder.Entity<Fund>().ToTable("Funds");
    modelBuilder.Entity<InvestorFund>().ToTable("InvestorFunds");
    
  • 每个层次结构的表 (TPH)意味着 Fund、InvestorFund 和 BaseEntity 属性都将合并到一个名为 BaseEntity 的表中,并且需要一个额外的字段来指示哪一行是哪种类型。这个额外的字段称为鉴别器。

    modelBuilder.Entity<BaseEntity>()
      .Map<Fund>(m => m.Requires("Discriminator").HasValue("F"))
      .Map<InvestorFund>(m => m.Requires("Discriminator").HasValue("I"));
    
  • 每个具体类型的表 (TPC)意味着 Fund 和 InvestorFund 都有自己的表,其中还包括其基类所需的任何字段。

    modelBuilder.Entity<Fund>().Map(m => {
                  m.MapInheritedProperties();
                  m.ToTable("Funds"); 
    }); 
    modelBuilder.Entity<InvestorFund>().Map(m => {
                  m.MapInheritedProperties();
                  m.ToTable("InvestorFunds"); 
    });
    
于 2013-05-03T18:16:33.897 回答
0

您需要运行迁移。

转到包管理器控制台,然后update-database在启用自动迁移后键入。

于 2013-11-22T02:29:56.973 回答