2013-05-20 92 views
0

我想我在這裏有一個設計問題。流利的nhibernate一對多收集,通過enum過濾

基本上我已經叫辦公室

class Office 
{ 
    public virtual long Id { get; set; } 
    public virtual string Code { get; set; } 
    public virtual IList<Person> Managers { get; set; } 
    public virtual IList<Person> Developers { get; set; } 
    public virtual IList<Person> TeaMakers { get; set; } 
} 

和一個名爲Person

class Person 
{ 
    public virtual long Id { get; set; } 
    public virtual string Name {get; set;} 
    public virtual StaffType Type { get; set;} 
    public virtual Office Office { get; set; } 
} 

類和一個名爲StaffType

public enum StaffType 
{ 
    MANAGER, 
    DEVELOPER, 
    TEAMAKER 
} 

映射Person表枚舉類很簡單:

public class PersonMap: ClassMap<Person>  
{ 

    public PersonMap() 
    { 
    Table("Person"); 
    Id(x => x.Id); 
    Map(x => x.Name); 
    References(x => x.Office).ForeignKey("Id").Not.Nullable() 
    Map(x => x.Type).CustomType<StaffType>(); 
    } 
} 

但我難住在辦公室地圖上。如何讓地圖使用枚舉過濾3個列表?

如果我這樣做:

public class OfficeMap: ClassMap<Office>  
{ 
    public static string TableName = "Office"; 
    public static string MappingColumn = TableName + "Id"; 


    public OfficeMap() 
    { 
     Table(TableName); 
     Id(x => x.Id); 
     Map(x = x.Code); 

     HasMany(x => x.Managers) 
      .Cascade.AllDeleteOrphan() 
      .Fetch.Select() 
      .Inverse().KeyColumn(MappingColumn); 

    HasMany(x => x.Developers) 
      .Cascade.AllDeleteOrphan() 
      .Fetch.Select() 
      .Inverse().KeyColumn(MappingColumn); 

    HasMany(x => x.TeaMakers) 
      .Cascade.AllDeleteOrphan() 
      .Fetch.Select() 
      .Inverse().KeyColumn(MappingColumn); 
    } 
} 

流暢度不會有foggiest知道如何通過StaffType枚舉

感謝您的幫助

額外注分裂3個收藏了起來: Person表的Type類型字段allways被映射爲int。

回答

0

NHibernate支持過濾作爲映射的一部分。請在這裏閱讀更多6.2. Mapping a Collection

訣竅是將更多的SQL添加到映射中。事實上,一些WHERE條件,在收集負載期間進行評估。從文檔小提取物:

<map // or <set or <bag ... 
    name="propertyName"           (1) 
    table="table_name"           (2) 
    ... 
    where="arbitrary sql where condition"      (9) 

而WHERE的描述:

where(可選)指定任意的SQL WHERE檢索或者刪除這個集合時使用 條件,如果(有用收集 應該只包含可用數據的一個子集)

在你的情況下,流暢的語法類似:...Where("MyColumn = 'myValue' ");

一種解決方案草案:

... 
HasMany(x => x.Managers) 
    .Cascade.AllDeleteOrphan() 
    .Fetch.Select() 
    .Inverse().KeyColumn(MappingColumn) 
    .Where("Type = 1") // the Column name in the Person table 
;      // and the value 1 as the enum of the Manager 
... 
// The same for the others 
0

我想這個模型作爲一個簡單的一對多(辦公室有許多人),並添加一個擴展方法IEnumerable<Person>通過StaffType過濾。如果需要,您可以通過AddManager等方法來封裝對Person集合的訪問權限等方法來執行業務規則。