我是 NHibernate 和 FluentNHibernate 的新手。我试图找出在不同模式中的表之间设置映射的最佳方法,以及可能在映射中进行一些过滤。
在我的场景中,我有与医院相关联的医生,其中一名医生可以与多家医院相关联。在某些医院,医生可能会被列入执行某些程序的黑名单。黑名单的程度也非常高,我只对黑名单类型为零的人感兴趣。因为表驻留在不同的模式中并由不同的 IT 组管理,所以用于连接的列名并不总是匹配的。我试图找出映射这种关系的最佳方式。
我有部分工作,但我不确定如何设置整个关系,以便我只获得医生具有特定黑名单指定的那些医院。
这是我的实体的精简版。
public class Doctor
{
pubilc virtual int DoctorId { get; set; }
public virtual string Name { get; set; }
public virtual IList<BlackListSite> BlackListedSites { get; set; }
}
public class BlackListSite
{
public virtual int DoctorId { get; set; }
public virtual int HospitalId { get; set; }
public virtual int ProcedureId { get; set; }
public virtual int BlackListTypeId { get; set; }
public virtual IList<Facility> Facilities { get; set; } //these are the hospitals
}
public class Facility //this represents a hospital
{
public virtual int FacilityId{ get; set; }
public virtual string Name { get; set; }
}
这是我正在映射 BlackListSite 和医院的方式,它正在工作。
public class BlackListSitesMap : ClassMap<BlackListSites>
{
public BlackListSitesMap()
{
Schema("schema1");
Table("RestrictedDoctors");
Id(x => x.BlackListId).GeneratedBy.Identity();
Map(x => x.DoctorId);
Map(x => x.HospitalId);
Map(x => x.Status);
HasMany(x => x.Facilities).Cascade.All().Not.LazyLoad()
.KeyColumns.Add("HospitalID",
mapping => mapping.Name("FacilityID"));
}
}
public class FacilityMap : ClassMap<Facility>
{
public FacilityMap()
{
Schema("schema2");
Table("Facility");
Id(x => x.FacilityId);
Map(x => x.Name);
Map(x => x.Active);
}
}
像这样的查询为我提供了黑名单类型为 0 的黑名单站点列表。
public void TestBlackList()
{
using (var session = SessionManager.Session())
{
var blacklist = session.Query<BlackListSites>().
Where(b => b.DoctorId == 1 && b.HospitalId != null
&& b.Status == 0).ToList();
}
}
我不知道如何将列入黑名单的网站与医生联系起来,这样当我请求医生时,我会得到一份医生被列入黑名单且黑名单类型为零的网站列表。有任何想法吗?
如果我不能在映射上执行此操作,我能否以某种方式在 Doctor 上设置查询以过滤 BlackListTypeId = 0 的黑名单?无论如何,这可能是最理想的。它会让我在未来请求其他黑名单类型。