Узнайте тип с первичным ключом, данным в 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; }
}

Я использую Entity Framework с таблицей на иерархию, так что в базе данных будет одна таблица, в которой хранятся и 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, он скажет

"Найденная сущность имела тип SavingAccount, когда запрашивалась сущность типа CheckingAccount".

когда я вызываю первый метод Find().

Как я могу узнать тип, учитывая только первичный ключ и два типа, к которым он может принадлежать?

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

Вы пытались использовать 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!");
    }
}
Другие вопросы по тегам