使用 TPH 找出 Entity Framework 中给出的主键类型
Find out type with primary key given in Entity Framework using 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 与 Table per Hierarchy 一起使用,这样数据库中就会有一个 table 同时包含 CheckingAccount- Records 和 SavingAccount-Records,这个 table 将包含一个名为 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 时,它会说
"The entity found was of type SavingAccount when an entity of type CheckingAccount was requested."
当我调用第一个 Find() 方法时。
如何只给定主键和它可能属于的两种类型来找出类型?
您是否尝试过使用 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!");
}
}
您可以通过基本实体 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!");
}
我有以下场景:
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 与 Table per Hierarchy 一起使用,这样数据库中就会有一个 table 同时包含 CheckingAccount- Records 和 SavingAccount-Records,这个 table 将包含一个名为 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 时,它会说
"The entity found was of type SavingAccount when an entity of type CheckingAccount was requested."
当我调用第一个 Find() 方法时。
如何只给定主键和它可能属于的两种类型来找出类型?
您是否尝试过使用 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!");
}
}
您可以通过基本实体 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!");
}