NHibernate映射文件帮助

时间:2009-05-06 08:06:45

标签: nhibernate model nhibernate-mapping mapping dns

NHibernate noob在这里。寻找有关如何映射以下常见场景的建议:

[存储]
id pk
名称

[StockItem]
id pk
名称

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

我创建了一个域模型,允许使用AssignToStore(商店商店)方法通过StockItem实体将各种StockItem分配给各种商店。

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

任何提示都非常感谢。

CHEV

2 个答案:

答案 0 :(得分:1)

我强烈建议您阅读nHibernate。这是一个非常好的起点:

The nHibernate FAQ

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

Fluent nHibernate

祝你好运!

答案 1 :(得分:1)

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

我的方法是将它设置为两个多对一映射,其中Store映射中的以下关系和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>

Store类将包含以下集合:

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

和StockItem将再次相反:

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

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

取决于您从Store或StockItem查看StockItemStore对象的哪一方将为null。它可以分为两类,但我发现这种方法更容易使用。它只是要求您作为开发人员知道您正在接近它的哪一方,但在我看来,这是使代码更简单,更可重用的良好权衡

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中的单个唯一标识符,而是在链接表中使用的是复合键。但它在过去整体上对我很有帮助。如果你真的需要它,我相信你可以以某种方式窃取那个id。

这种方法非常适合使用HQL进行查询。如果你试图使用ICriteria查询,它往往会有点不稳定。有一些解决方案使用数据库视图来模拟另一个用于查询的表,这些表对我有用。

如果你需要做ICriteria查询,请告诉我,我可以发布一些示例代码。

  • 最高