2011-05-26 212 views
2

我有两个表,可以说店和部门。流利的nHibernate映射问题

ShopTable 
    ShopId 
    ShopName 

DepartmentTable 
    DepartmentId 
    ShopId 
    Name 
    Type 

好了,现在我映射shoptable到店铺等级

public class Shop 
    { 
     public virtual int ShopId {get; set;} 
     public virtual string ShopName {get; set;} 
     public virtual Department Toys { get; set; } 
     public virtual Department Hardware { get; set; } 
     public virtual Department Food { get; set; } 
    } 

    public class Department 
    { 
     public virtual int DepartmentId { get; set; } 
     public virtual int ShopId { get; set; } 
     public virtual string Name { get; set; } 
     public virtual DepartmentType Type { get; set; } 
    } 

如何映射玩具硬件和食品?

public class ShopMap : ClassMap<Shop> 
    { 
     Id(x => x.ShopId); 
     Map(x=> x.ShopName); 
     // How do I map these according to the DepartmentType enum? 
     Map(x=> x.Toys); 
     Map(x=> x.Hardware); 
     Map(x=> x.Food); 
    } 

    public class DepartmentMap : ClassMap<Department> 
    { 
     Id(x => x.DepartmentId); 
     Map(x=> x.ShopId); 
     Map(x=> x.Name); 
     Map(x=> x.Type); 
    } 

回答

2

在给出数据库表模式的情况下,您在问题中显示的类结构将不支持您想要执行的操作。从Shop类到Department类有一对多的关系。这里,将工作给你的表结构的映射:

public class Shop 
    { 
     public virtual int ShopId {get; set;} 
     public virtual string ShopName {get; set;} 
     public virtual IList<Department> Departments { get; set; } 
    } 

    public class Department 
    { 
     public virtual int DepartmentId { get; set; } 
     public virtual Shop Shop { get; set; } 
     public virtual string Name { get; set; } 
     public virtual DepartmentType Type { get; set; } 
    } 

对于映射:

public class ShopMap : ClassMap<Shop> 
    { 
     Id(x => x.ShopId); 
     Map(x=> x.ShopName); 

     HasMany(c => c.Departments); 
    } 

    public class DepartmentMap : ClassMap<Department> 
    { 
     Id(x => x.DepartmentId); 

     References(x => x.Shop, "ShopId"); 

     Map(x=> x.Name); 
     Map(x=> x.Type); 
    } 
+0

是啊,我知道,我可以有对象的名单,但你说,它不是”是否有可能以任何方式将它们作为单独的对象? 会帮助我很多,因为如果他们在列表中,我将不得不循环每次访问其中的一个列表。 – TuomasK 2011-05-26 19:45:28

+0

您无法避免搜索您想要的特定部门的馆藏。推荐的类将允许NHibernate为您的表结构生成正确的SQL。你可以在你的类的属性或方法上封装集合上的特定查询。这些方法或属性不会在NHibernate中映射,因此它们不会影响数据库操作。例如:public department toys {get {Departments.FirstOrDefault(d => d.DepartmentId == ToysDepartmentId); }} – 2011-05-26 21:11:41

+0

这有点奇怪,因为使用集合你可以这样做。 HasMany(x => x.Departments).KeyColumn(“ShopId”)。其中(y => y.Type == DepartmentType.Toys); – TuomasK 2011-05-27 05:36:59