使用基于抽象类的子 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}

有没有办法只访问该数据库一次即可做到这一点。

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

创建继承层次结构的另一个级别:

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。它会相当长,有点混乱。不过,实际上,您的问题是抽象。