1

我是 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 的黑名单?无论如何,这可能是最理想的。它会让我在未来请求其他黑名单类型。

4

1 回答 1

3

我会将课程更改为

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);
    }
}
于 2012-09-17T18:18:56.650 回答