实体框架Code First - 无效的列名Discriminator

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

我的Code First连接SQL查询

from fund in context.Funds

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

抛出一个无效的列名Discriminator

2个回答

10

您需要告诉Code First如何将这些类与表相关联。有三种选择:

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

modelBuilder.Entity<Fund>().ToTable("Funds");
modelBuilder.Entity<InvestorFund>().ToTable("InvestorFunds");
  • 层次结构表(TPH)意味着,基金(Fund)、投资者基金(InvestorFund)和基本实体(BaseEntity)属性将全部合并到一个名为BaseEntity的单个表中,并需要添加额外的字段来指示每一行是哪种类型。这个额外的字段称为鉴别器(discriminator)

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

  • 你应该能够使用我在TPT下编写的代码行来避免这个错误。 - DamienG
    在这个例子中,“Type”应该是“Discriminator”。 - Ε Г И І И О
    这对"NoteMap"类的映射有什么影响? - Chazt3n
    什么是“NoteMap”? - DamienG

    0

    您需要运行迁移。

    进入程序包管理器控制台,启用自动迁移后,输入update-database命令即可。


    1
    这与迁移无关。 - Jalal

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接