Entity Framework Core TPH 在派生类型上带有外键错误

问题描述 投票:0回答:1

我正在尝试将成熟的 Entity Framework 6.4.4 项目转换为 Entity Framework Core 8(将来我可以与其他人一起),但我遇到了以下运行时错误:

这是我的模型:

public partial class HighlandEntities : DbContext
{
  public virtual DbSet<Target> Targets { get; set; }

  public virtual DbSet<AccountTarget> AccountTargets { get; set; }

  public virtual DbSet<PortfolioTarget> PortfolioTargets { get; set; }

  protected override void OnModelCreating(ModelBuilder modelBuilder)
  {

    modelBuilder.Entity<Target>(entity =>
    {
      entity.ToTable("Targets").HasDiscriminator<char>("OwnerType")
        .HasValue<PortfolioTarget>('P')
        .HasValue<AccountTarget>('A');

      entity.Property(e => e.TargetID).ValueGeneratedNever();
      entity.Property(e => e.RowVersion)
        .IsRowVersion()
        .IsConcurrencyToken();
    });

  }
}

public abstract partial class Target : EntityBase
{
  [Key]
  public Guid TargetID { get; set; }

  [Column(TypeName = "date")] 
  public DateTime? AsOfDate { get; set; }

  public double TargetPct { get; set; }
}

public partial class AccountTarget : Target
{

  Guid _AccountID;
  [Column("OwnerID")] 
  public virtual Guid AccountID { get; set; }

  Guid _InvestmentID;
  [Column("BalanceOwnerID")]
  public virtual Guid InvestmentID { get; set; }

  [ForeignKey(nameof(AccountID))]
  [InverseProperty("AccountTargets")]
  public virtual Account Account { get; set; }

  [ForeignKey(nameof(InvestmentID))]
  [InverseProperty("AccountTargets")]
  public virtual Investment Investment { get; set; }

}

public partial class PortfolioTarget : Target
{

  Guid _PortfolioID;
  [Column("OwnerID")]
  public virtual Guid PortfolioID { get; set; }

  Guid _InvestmentID;
  [Column("BalanceOwnerID")]
  public virtual Guid InvestmentID { get; set; }

  [ForeignKey(nameof(PortfolioID))]
  [InverseProperty("PortfolioTargets")]
  public virtual Portfolio Portfolio { get; set; }

  [ForeignKey(nameof(InvestmentID))]
  [InverseProperty("PortfolioTargets")]
  public virtual Investment Investment { get; set; }

}

有关更多上下文,请参阅 EF 6 版本的 *.edmx 文件中的对象:

我应该如何更改它来解决此错误?谢谢。

c# entity-framework entity-framework-core tph
1个回答
0
投票

您的实体存在一些问题。

首先,这不是 TPH。 TPH 使用鉴别器在单个表中包含所有子类的所有列。例如,您将有一个目标表,其中包含鉴别器(或目标类型等)列,其值为“帐户”与“投资组合”。您在架构中概述的实际上是 TPT 模型。 (每种类型的表)

在 TPT 中,如果 TargetAccount 和 TargetPortfolio 是 Target 的子类,则每个目标都有一个 TargetId 作为其 PK,分别包含特定于账户的详细信息和特定于投资组合的详细信息。当我在这些表中看到诸如 AccountId 和 PortfolioId 之类的内容时,通过导航到帐户或投资组合表,那么这些实际上并不是基于继承的关系,它们是多对多连接表,应该简单地设置为多-一对多连接实体,不是围绕 Target 的继承结构。

我首先会完全忽略继承并查看数据。在定义表格时,目标、投资组合和账户实际上如何相互关联?这看起来确实像是您跳进了一个完全没有必要的继承兔子洞。

© www.soinside.com 2019 - 2024. All rights reserved.