我是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和Hospital。
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的黑名单吗?无论如何,这可能是最理想的。它将在未来要求我提出其他黑名单类型。
答案 0 :(得分:2)
我会将课程更改为
public class Doctor
{
pubilc virtual int DoctorId { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<BlackListSite> BlackListedSitesTypeZero { get; set; }
}
public class BlackListSite
{
public virtual Doctor Doctor { get; set; }
public virtual Facility Hospital { 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 DoctorMap : ClassMap<Doctor>
{
public DoctorMap()
{
...
HasMany(x => x.BlackListedSitesTypeZero)
.KeyColumn("DoctorId")
.Where("status = 0");
}
}
然后在映射中指定where条件
public class BlackListSiteMap : ClassMap<BlackListSite>
{
public BlackListSiteMap()
{
Schema("schema1");
Table("RestrictedDoctors");
Id(x => x.BlackListId).GeneratedBy.Identity();
References(x => x.Doctor, "DoctorId");
References(x => x.Hospital, "HospitalId");
Map(x => x.Status);
}
}