我正在使用实体框架6代码优先,使用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
是否具有属性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}
有没有办法只需一次访问该数据库即可完成此操作。
答案 0 :(得分:2)
创建继承层次结构的另一个级别:
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
,以获取该类型的项目。
答案 1 :(得分:0)
这似乎是一个抽象级问题,可能不需要抽象类。在这么小的课程中,它并没有真正为你节省任何东西。另外,因为某些派生类型非常相似,如果你真的想要抽象它,你应该使用一个接口。
但是,要回答您的问题,您可以使用is
运算符,甚至可以使用linq。这将是相当长的,有点凌乱。但实际上,你的问题就是抽象。