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