gpt4 book ai didi

ef-code-first - Entity Framework 代码优先 - 无效的列名鉴别器

转载 作者:行者123 更新时间:2023-12-01 08:32:42 28 4
gpt4 key购买 nike

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

My Code First Join SQL 查询

from fund in context.Funds

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

抛出一个无效的列名鉴别器

最佳答案

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

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

    modelBuilder.Entity<Fund>().ToTable("Funds");
    modelBuilder.Entity<InvestorFund>().ToTable("InvestorFunds");
  • Table per heirarchy (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");
    });

关于ef-code-first - Entity Framework 代码优先 - 无效的列名鉴别器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16273887/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com