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

时间:2018-01-16 21:19:27

标签: c# mysql .net entity-framework 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; }
}

我正在使用Table per Hierarchy的实体框架,因此数据库中将有一个表同时包含 CheckingAccount -Records和 SavingAccount -Records此表将包含一个名为 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时,它会说

  

“当请求CheckingAccount类型的实体时,找到的实体属于SavingAccount类型。”

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

如何找出仅给出主键及其可能属于的两种类型的类型?

2 个答案:

答案 0 :(得分:2)

您可以通过基本实体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!");
}

答案 1 :(得分:0)

您是否尝试使用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!");
    }
}