2012-08-31 32 views
0

我是NHibernate和FluentNHibernate的新手。我試圖找出在不同模式中的表之間設置映射的最佳方式,並且可能會在映射中進行一些過濾。帶過濾器的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的黑名單嗎?無論如何,這可能是最理想的。它會讓我在將來要求其他黑名單類型。

回答

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