NHibernate noob在这里。寻找有关如何映射以下常见场景的建议:
[存储]
id pk
名称
[StockItem]
id pk
名称
[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel
我创建了一个域模型,允许使用AssignToStore(商店商店)方法通过StockItem实体将各种StockItem分配给各种商店。
我现在使用nhibernate来创建我的数据库模式。如何为此基本方案设置映射文件?
任何提示都非常感谢。
CHEV
答案 0 :(得分:1)
我强烈建议您阅读nHibernate。这是一个非常好的起点:
我还建议您在前几次手动执行映射。之后,你应该看看Fluent nHibernate。流畅的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查询,请告诉我,我可以发布一些示例代码。