使用基于抽象类的子EF实体属性

时间:2013-10-24 15:37:32

标签: c# entity-framework ef-code-first

我正在使用实体框架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}

有没有办法只需一次访问该数据库即可完成此操作。

2 个答案:

答案 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。这将是相当长的,有点凌乱。但实际上,你的问题就是抽象。

相关问题