使用 TPH 找出 Entity Framework 中给出的主键类型

Find out type with primary key given in Entity Framework using TPH

我有以下场景:

public abstract class Account
{
    public Guid PKey { get; set; } = Guid.NewGuid();    
    public string Owner { get; set; }
}

public class CheckingAccount : Account
{
    public int Fee { get; set; }
}

public class SavingAccount : Account
{
    public double InterestRate { get; set; }
}

我将 Entity Framework 与 Table per Hierarchy 一起使用,这样数据库中就会有一个 table 同时包含 CheckingAccount- Records 和 SavingAccount-Records,这个 table 将包含一个名为 Discriminator 的列,其中填充了值 "CheckingAccount"或分别 "SavingAccount"。

现在我想以一个主键(Guid)作为输入,找出这个主键所属记录的类型。

我有一个给定的 Guid,想知道这个 Guid 的记录是 CheckingAccount-Record 还是 SavingAccount-Record。

我试过这样的事情:

using(MyContext ctx = new Context())
{
    CheckingAccount ca = ctx.CheckingAccount.Find(pKey);
    SavingAccount sa = ctx.SavingAccount.Find(pKey);

    if(ca != null)
    {
        Console.WriteLine("It's a CheckingAccount!");
    }
    else if(sa != null)
    {
        Console.WriteLine("It's a SavingAccount!");
    }
}

但是,这会导致 InvalidOperationException:当记录是 SavingAccount 时,它会说

"The entity found was of type SavingAccount when an entity of type CheckingAccount was requested."

当我调用第一个 Find() 方法时。

如何只给定主键和它可能属于的两种类型来找出类型?

您是否尝试过使用 varobject 作为 casa 的类型?

试一试:

using(MyContext ctx = new Context())
{
    object ca = ctx.CheckingAccount.Find(pKey);
    object sa = ctx.SavingAccount.Find(pKey);

    if(ca is CheckingAccount)
    {
        Console.WriteLine("It's a CheckingAccount!");
    }
    else if(sa is SavingAccount)
    {
        Console.WriteLine("It's a SavingAccount!");
    }
}

您可以通过基本实体 DbSet 使用 EF 多态查询。像这样的东西应该可以完成工作:

var account = ctx.Set<Account>().Find(pKey);
if(account is CheckingAccount)
{
    Console.WriteLine("It's a CheckingAccount!");
}
else if (account is SavingAccount)
{
    Console.WriteLine("It's a SavingAccount!");
}