使用tph找出实体框架中给定主键的类型

eivnm1vs  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(321)

我有以下场景:

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; }
}

我使用的是实体框架,每个层次结构有一个表,这样数据库中就有一个表同时包含checkingaccount记录和savingaccount记录,这个表将包含一个名为discriminator的列,该列分别填充值“checkingaccount”或“savingaccount”。
现在,我想将一个主键(guid)作为输入,并找出这个主键所属的记录的类型。
我有一个给定的guid,想知道这个guid的记录是checkingaccount记录还是savingaccount记录。
我试过这样的方法:

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时,它会说
“请求checkingaccount类型的实体时,找到的实体的类型为savingaccount。”
当我调用第一个find()方法时。
我怎样才能找出只有主键的类型和它可能属于的两种类型?

j2cgzkjk

j2cgzkjk1#

你用过吗 var 或者 object 作为的类型 ca 以及 sa ?
试一试:

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

vfh0ocws2#

您可以通过基本实体使用ef多态查询 DbSet . 像这样的事情应该可以做到:

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

相关问题