繁体   English   中英

NHibernate:映射IList属性

[英]NHibernate: Mapping IList property

我有下表, 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清单(关系)?

请参阅参考文档中的集合映射 有几种方法可以映射IList属性。

bag是无序的,无索引的集合,可以多次包含相同的元素。

<bag name="Transactions" lazy="true" table="Transaction" >
    <key column="OrderId"/>
    <one-to-many class="Transaction"/>
</bag>

集合是一个无序的,无索引的集合,包含唯一的元素。

<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可以使用sort属性以排序顺序返回无序集合。

没有提到级联,没有讨论收集映射我们完整。 这使得父实体上的操作可以应用于集合实体。

  • <many-to-one><many-to-many>关联上启用级联通常没有意义。 Cascade通常用于<one-to-one><one-to-many>关联。
  • 如果子对象的生命周期受父对象的生命周期限制,请通过指定cascade =“all-delete-orphan”将其设置为生命周期对象。
  • 否则,您可能根本不需要级联。 但是如果你认为你经常在同一个交易中与父母和孩子一起工作,并且你想节省一些打字,可以考虑使用cascade =“persist,merge,save-update”

如果您控制数据库,那么使用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

我不确定你在问什么。 假设TransactionsPayments已经在nhibernate中映射,你需要为Order关联映射添加级联选项。在流畅的nhibernate中,类似这样的事情:

References(x => x.Payments)
    .Cascade.All
...

这将确保当您向订单添加交易/付款时,它们会被持久化。

编辑

无论你是否使用流利的nhibernate,级联是(我认为)你想要的选项。 映射集合的nhibernate文档就在这里

找出适合我的工作解决方案。 在我添加的映射文件中:

<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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM