0

我想我在这里有一个设计问题。

本质上我有一个叫做办公室的类

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

流畅性不会有最模糊的想法如何通过 StaffType 枚举拆分 3 个集合

谢谢您的帮助

额外说明:Person 表的 Type 字段总是被映射为 int。

4

2 回答 2

0

我会将其建模为简单的一对多(Office 有很多人),并添加一个扩展方法以IEnumerable<Person>按 StaffType 进行过滤。AddManager如果需要,您可以通过强制执行业务规则的等方法封装对 Person 集合的访问。

于 2013-05-20T18:43:11.163 回答
0

NHibernate 支持将过滤作为映射的一部分。请在此处阅读更多6.2。映射集合

诀窍是在映射中添加更多 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
于 2013-05-20T17:42:02.373 回答