鉴于此实体:
public class Product
{
public double[] Prices;
}
使用此表结构:
Product (Id)
Price (ProductId, Order, Price)
我对使用列表,包,原始数组,数组等之间的区别感到困惑。我对原始数组找不到太多解释。
一个重要的要求是,应始终以相同的顺序存储和检索数组项,并且可能包含重复的值。
我的问题是,这两个表之间的映射如何?
答案 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
,因为重复的价格确实是不同的实体。