我正在尝试将成熟的 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 文件中的对象:
我应该如何更改它来解决此错误?谢谢。
您的实体存在一些问题。
首先,这不是 TPH。 TPH 使用鉴别器在单个表中包含所有子类的所有列。例如,您将有一个目标表,其中包含鉴别器(或目标类型等)列,其值为“帐户”与“投资组合”。您在架构中概述的实际上是 TPT 模型。 (每种类型的表)
在 TPT 中,如果 TargetAccount 和 TargetPortfolio 是 Target 的子类,则每个目标都有一个 TargetId 作为其 PK,分别包含特定于账户的详细信息和特定于投资组合的详细信息。当我在这些表中看到诸如 AccountId 和 PortfolioId 之类的内容时,通过导航到帐户或投资组合表,那么这些实际上并不是基于继承的关系,它们是多对多连接表,应该简单地设置为多-一对多连接实体,不是围绕 Target 的继承结构。
我首先会完全忽略继承并查看数据。在定义表格时,目标、投资组合和账户实际上如何相互关联?这看起来确实像是您跳进了一个完全没有必要的继承兔子洞。