如何使用nHibernate持久化原始数组

时间:2011-01-21 16:34:00

标签: c# arrays nhibernate

鉴于此实体:

public class Product
{

  public double[] Prices;
}

使用此表结构:

Product (Id)
Price (ProductId, Order, Price)

我对使用列表,包,原始数组,数组等之间的区别感到困惑。我对原始数组找不到太多解释。

一个重要的要求是,应始终以相同的顺序存储和检索数组项,并且可能包含重复的值。

我的问题是,这两个表之间的映射如何?

2 个答案:

答案 0 :(得分:3)

为了保留订单,您需要< list />,并提供索引列以跟踪元素(或实体)订单。您可以拥有一个似乎更适合您需要的元素列表(简单类型)。

答案 1 :(得分:0)

如果您确定您的数据永远不会有不一致的数组数据作为价格(所有产品的索引始终为0,从不为产品编制任何价格索引漏洞或重复项),请将其映射为<array>

(最好将价格改为decimal type instead of double。)

<class name="Product">
    <id name="Id"  generator="..." />
    <array name="Prices" table="Price">
        <key column="ProductId" />
        <index column="Order"/>
        <element type="decimal" length="19" precision="4">
            <column name="Price" />
        </element>
    </array>
</class>

您也可以使用Felice's answer中所写的列表,但是然后将您的媒体资源键入IList<decimal>

至于primitive-array,看起来我们不必费心去做,这是一个从java Hibernate继承的映射,对应于一个与C#无关的概念,原语。
这可能是Paco's comment的含义,我一开始并没有理解。这似乎得到了NH issue的证实。

如果您无法保证数据库中的索引一致性(并非总是从0开始,可能有相同产品的漏洞或重复索引,......),那么您将不得不更改模型以将价格映射为{{ 1}}子实体(<set>)带有您将通过自己的代码处理的索引。 (加载数据时的排序部分可以通过ISet<Price> Prices映射上的order-by="Order"属性进行处理。)
产品的重复价格也是DB中的不同行,用于处理不同的索引。因此我建议使用set而不是set,因为重复的价格确实是不同的实体。