我有下一个表Order
,Transaction
,Payment
。类Order
有一些属性:
public virtual Guid Id { get; set; }
public virtual DateTime Created { get; set; }
...
我又增加了两个:
public virtual IList<Transaction> Transactions { get; set; }
public virtual IList<Payment> Payments { get; set; }
如何在数据库中保留Transactions
和Payments
列表(关系)?
答案 0 :(得分:7)
请参阅参考文档中的collection mapping。有几种方法可以映射IList
属性。
bag 是一个无序的,无索引的集合,可能多次包含相同的元素。
<bag name="Transactions" lazy="true" table="Transaction" >
<key column="OrderId"/>
<one-to-many class="Transaction"/>
</bag>
set 是一个无序的,无索引的集合,其中包含唯一元素。
<set name="Transactions" lazy="true" table="Transaction" >
<key column="OrderId"/>
<one-to-many class="Transaction"/>
</set>
列表是一个有序和索引的集合,可能多次包含相同的元素。
<list name="Transactions" lazy="true" table="Transaction" >
<key column="OrderId"/>
<index column="ordering"/>
<one-to-many class="Transaction"/>
</list>
NHibernate可以使用排序属性按排序顺序返回无序集合。
在没有提及级联的情况下,没有讨论我们完整的集合映射。这使得父实体上的操作可以应用于集合实体。
<many-to-one>
或<many-to-many>
关联上启用级联通常没有意义。 Cascade通常用于<one-to-one>
和<one-to-many>
关联。答案 1 :(得分:1)
如果您控制数据库,那么使用NHib的一个好处就是它会为您生成数据库,包括在那里维护列表所需的外键。使用以下代码执行此操作:
try
{
var schema = new SchemaExport(cfg);
schema.Drop(false, true);
schema.Create(true, true);
}
catch (Exception ex)
{
Console.WriteLine(@"Schema Export Error Message: {0}", ex);
}
其中cfg是您的NHibernate配置对象。
如果这样可以解决您的问题,或者您提出的问题不同,请告诉我们。
Berryl
答案 2 :(得分:0)
我不确定你在问什么。假设Transactions
和Payments
已经在nhibernate中映射,你需要为Order
的关联映射添加级联选项。在流畅的nhibernate中,这样的事情:
References(x => x.Payments)
.Cascade.All
...
这将确保当您向订单添加交易/付款时,它们会被保留。
修改强>
无论你是否使用流利的nhibernate,级联是(我认为)你想要的选项。映射集合的nhibernate文档是here。
答案 3 :(得分:0)
为我找出工作解决方案。在映射文件中,我添加了:
<bag name="Transactions" lazy="true" table="Transaction" >
<key column="OrderId"/>
<one-to-many class="Transaction"/>
</bag>
<bag name="Payments" lazy="true" table="Payment">
<key column="OrderId"/>
<one-to-many class="Payment"/>
</bag>