如何坚持与NHibernate

如何坚持与NHibernate

问题描述:

基本数组鉴于这种实体:如何坚持与NHibernate

public class Product 
{ 

    public double[] Prices; 
} 

有了这张表结构:

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

我很困惑,之间。当使用列表中的差异,一个包,一个原始数组,一个数组等,我无法在原始数组上找到太多的解释。

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

我的问题是,这两张表格之间的映射关系如何?

+0

我会删除标记'primtive',这在理论编程中有实际意义。 – 2011-01-21 16:38:54

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

如果您确定地知道您的数据不会以价格(索引从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,因为重复价格确实是不同的实体。