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と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();
    }
}

ブラックリストに登録されたサイトを医師に関連付ける方法がわからないため、医師をリクエストすると、医師がブラックリストタイプのゼロでブラックリストに登録されているサイトのリストが表示されます。何か案は?

マッピングでこれを実行できない場合、BlackListTypeId = 0のブラックリストをフィルタリングするようにDoctorでクエリを設定できますか?とにかくそれが最も理想的かもしれません。将来、他のブラックリストタイプをリクエストするように設定されます。

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 に答える