使用基于抽象类的子 EF 实体属性
本文关键字:EF 实体 属性 抽象类 | 更新日期: 2023-09-27 18:36:54
>我正在使用Entity Framework 6 Code First,以及c#4.0和Visual Studio 2012。以下是代码片段。
我有一个基本的抽象类:
public abstract class Person
{
public int PersonID { get; set; }
public String Name { get; set; }
}
我从中得出三个实体:
public class Contact : Person
{
public Nullable<int> NHSTrustID { get; set; }
public virtual NHSTrust NHSTrust { get; set; }
}
public class User : Person
{
public int NHSTrustID { get; set; }
public virtual NHSTrust NHSTrust { get; set; }
}
public class Notifier : Person
{
public int NotifierTypeID { get; set; }
public virtual NotifierType NotifierType { get; set; }
}
这些实体声明为:
public DbSet<Person> Persons { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<Contact> Contacts { get; set; }
public DbSet<Notifier> Notifiers { get; set; }
以便 Person 实体也可以是查询。
一个可以属于三个派生的元素中的任何一个的person
。我需要知道person
是否具有NHSTrust
的属性。(Users
必须有一个NHSTrust
,因为Contacts
它是可选的,Notifiers
没有NHS信托。
我可以看到如何使用大量代码来做到这一点,但是有没有一种优雅的方法可以做到这一点?
更新我目前的"解决方案"是:
var tempPerson = dbContext.Persons.Find(personID);
NHSTrust nHSTrust = null;
if (tempPerson is Contact)
{
nHSTrust = dbContext.Contacts.Find(personID).NHSTrust;
}
else if (tempPerson is User)
{
nHSTrust = dbContext.Users.Find(personID).NHSTrust;
}
if (nHSTrust != null) { // do something}
有没有办法只访问该数据库一次即可做到这一点。
创建继承层次结构的另一个级别:
public abstract class TrustablePerson : Person
{
public NHSTrust NHSTrust { get; set; }
}
public class Contact : TrustablePerson
{
public Nullable<int> NHSTrustID { get; set; }
}
public class User : TrustablePerson
{
public int NHSTrustID { get; set; }
}
现在,您可以向上下文中添加一个获取该类型项的TrustablePerson
。
这似乎是一个抽象级问题,其中可能不需要抽象类。在这样的小班中,它并不能真正为您节省任何东西。此外,由于某些派生类型非常相似,因此如果您真的想抽象它,则可能应该使用接口。
但是,要回答您的问题,您可以使用 is
运算符,甚至可以使用 linq。它会相当长,有点混乱。不过,实际上,您的问题是抽象。