2009-05-06 123 views
0

NHibernate noob here。寻找咨询如何映射以下常见的场景:NHibernate映射文件帮助

[存储]
ID PK
名称

[StockItem]
ID PK
名称

[ StockItemStore]
id pk
StockItemId FK
STOREID FK
ParLevel

我已经创建了一个的DomainModel允许各种StockItems经由StockItem实体使用AssignToStore(存储商店)方法被分配给各种商店。

我现在使用nhibernate来创建我的数据库模式。如何为这个基本场景设置映射文件?

任何提示非常感谢。

CHEV

回答

1

不幸的是,这种关系并不是在nHibernate中建模最简单的事情,并且在尝试对链接表中的数据执行查询时会遇到一些固有问题,这需要一些复杂的解决方法,但是一旦得到它设置得很好。

我的方法是将其设置为两个多对一的映射,其中存储映射中的以下关系和StockItem映射中的反向关系。

<bag name="StockItems" table="StockItemStore" lazy="true"> 
    <key column="StoreId" /> 
    <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components"> 
    <property name="ParLevel" type="Int32" /> 
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" /> 
    </composite-element> 
</bag> 

的存储类将具有以下集合:

public virtual IList< StockItemStore > StockItems {get;set;}

和StockItem将再次逆:

public virtual IList< StockItemStore > Stores {get;set;}

的StockItemStore对象可以包含任何对象(Store或StockItem)以及链接表中的任何其他信息。(在这种情况下只是ParLevel)

取决于您在StoreItem或StockItem中查看StockItemStore对象的哪一侧将为空,它可以分解为两个类,但我觉得这种方法更容易处理。它只是需要你作为开发人员知道哪些方面你是从接近它,但它是一个很好的折衷为使代码更简单,更可重复使用在我看来

public class StockItemStore 
{ 
    private StockItem stockItem; 
    private Store store; 

    public virtual StockItem StockItem 
    { 
     get 
     { 
      if (stockItem == null) 
      { 
       stockItem = new StockItem(); 
      } 

      return stockItem; 
     } 
     set 
     { 
      stockItem = value; 
     } 
    } 

    public virtual Store store 
    { 
     get 
     { 
      if (store == null) 
      { 
       store = new Store(); 
      } 

      return store; 
     } 
     set 
     { 
      store = value; 
     } 
    } 

    public virtual int ParLevel { get; set; } 

} 

我的方法不使用单一的唯一标识符在你的问题中定义的StockItemStore中,而是在链接表中相当于一个复合关键字,但它在过去总体上对我很好,我相信你可以在s o如果你真的需要它。

这种方法适用于使用HQL进行查询。如果您正在尝试使用ICriteria查询,它往往会变得有点过分。有一些解决方案使用数据库视图模拟另一个表来用于查询已为我工作。

如果你需要做ICriteria查询让我知道,我可以张贴一些示例代码。

  • 最大
+0

我忘了提,我删除了它的StockItemStore类的代码示例简单,但你应该*总*实现equals和GetHashCode在NHibernate的对象 – 2009-05-06 19:37:09

1

我会强烈建议NHibernate的阅读起来。这里是一个非常好的起点:

The nHibernate FAQ

我也建议你做手工映射第几次。之后,你应该看看Fluent nHibernate。流利的nHibernate可以(除其他外)自动为您的域模型生成映射,并帮助您生成数据库模式。这是一个非常灵活的工具,越来越好。你会在这里找到它:

Fluent nHibernate

祝你好运!