gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:02:37 25 4
gpt4 key购买 nike

我正在使用 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 是否具有属性 NHSTrust。 (用户 必须有一个 NHSTrust,对于 Contacts 它是可选的,Notifiers 没有 NHS Trust。

我可以看到如何使用大量代码来做到这一点,但是有没有一种优雅的方法来做到这一点?

更新我目前的“解决方案”是:

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 添加到您的上下文中以获取该类型的项目。

关于c# - 使用基于抽象类的子 EF 实体属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19570348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com