3

我正在使用 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; }

这样 Persons 实体也可以是查询。

一个person可能属于三个派生实体中的任何一个的人。我需要知道 aperson是否具有属性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}

有没有办法通过一次访问该数据库来做到这一点。

4

2 回答 2

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; }
}

现在,您可以将 a 添加TrustablePerson到获取该类型项目的上下文中。

于 2013-10-24T16:38:29.470 回答
0

这似乎是一个抽象级别的问题,其中可能不需要抽象类。在这样的小班上,它并不能真正为您节省任何东西。此外,由于某些派生类型非常相似,如果您真的想抽象它,您可能应该使用接口。

但是,要回答您的问题,您可以使用is运算符,甚至使用 linq。这将是相当长的,有点凌乱。但是,实际上,您的问题是抽象。

于 2013-10-24T15:48:50.267 回答