FluentNHibernate映射与过滤器,是否可能?

时间:2012-08-31 00:50:55

标签: filtering fluent-nhibernate-mapping

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

1 个答案:

答案 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);
    }
}