NHibernate 菜鸟在这里。寻求有关如何绘制以下常见场景的建议:

[店铺]
身份PK
姓名

[库存商品]
身份PK
姓名

[库存商品商店]
身份PK
库存商品 ID fk
商店 ID fk
标准杆水平

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

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

任何提示都非常感激。

雪佛兰

有帮助吗?

解决方案

不幸的是,这种关系并不是在 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 查询,请告诉我,我可以发布一些示例代码。

  • 最大限度
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top