NHibernate:映射IList属性

时间:2010-03-22 17:00:12

标签: c# nhibernate

我有下一个表OrderTransactionPayment。类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; }

如何在数据库中保留TransactionsPayments列表(关系)?

4 个答案:

答案 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>关联。
  • 如果子对象的生命周期受父对象的生命周期限制,请通过指定cascade =“all-delete-orphan”使其成为生命周期对象。
  • 否则,您可能根本不需要级联。但是如果你认为你经常在同一个交易中与父母和孩子一起工作,并且你想节省一些打字,可以考虑使用cascade =“persist,merge,save-update”

答案 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)

我不确定你在问什么。假设TransactionsPayments已经在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>