1

我有以下情况:

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 with 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() 方法时。

我怎样才能找出只给定主键的类型和它可能属于的两种类型?

4

2 回答 2

2

您可以通过基本实体使用 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!");
}
于 2018-01-16T22:05:43.500 回答
0

您是否尝试过使用varorobject作为caand的类型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!");
    }
}
于 2018-01-16T21:36:52.480 回答