如何坚持与NHibernate
基本数组鉴于这种实体:如何坚持与NHibernate
public class Product
{
public double[] Prices;
}
有了这张表结构:
Product (Id)
Price (ProductId, Order, Price)
我很困惑,之间。当使用列表中的差异,一个包,一个原始数组,一个数组等,我无法在原始数组上找到太多的解释。
一个重要的要求是数组项目应该总是以相同的顺序存储和检索,并且可能包含重复的值。
我的问题是,这两张表格之间的映射关系如何?
为了保留订单,您需要一个<列表/ >,并提供一个索引列以跟踪元素(或实体)的顺序。你可以有一个元素列表(简单类型),看起来更适合你的需要。
如果您确定地知道您的数据不会以价格(索引从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开始,可能有同一产品的漏洞或重复索引,...),那么您将不得不更改模型以将您的价格映射为<set>
的子实体(ISet<Price> Prices
)与您将通过自己的代码处理的索引。 (在加载数据时的排序部分可以通过set
映射的order-by="Order"
属性进行处理。)
产品的重复价格也会是不同的行,以处理不同的索引。因此,我建议使用set
而不是bag
,因为重复价格确实是不同的实体。
我会删除标记'primtive',这在理论编程中有实际意义。 – 2011-01-21 16:38:54