2011-01-21 2 views
4

Учитывая этот объект:Как упорствовать примитивный массив с NHibernate

public class Product 
{ 

    public double[] Prices; 
} 

С помощью этой таблицы структуры:

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

Я смущен, чтобы разница между тем, когда использовать список, мешок, примитивный массив, массив и т. д. Я не мог найти много объяснений в примитивном массиве.

Важным требованием является то, чтобы элементы массива всегда сохранялись и извлекались в одном порядке и могли содержать повторяющиеся значения.

Вопрос в том, как будет выглядеть сопоставление между этими двумя таблицами?

+0

Я бы удалил тег «primtive», который имеет реальное значение в теоретическом программировании. –

+0

Удалено, спасибо –

+1

primitive = java. В C# он не отличается – Paco

ответ

3

Для того, чтобы сохранить заказ, нужен нумерованный список </> и укажите индексный столбец для отслеживания порядка элементов (или сущности). У вас может быть список элементов (простых типов), который, по-видимому, лучше подходит вам.

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, могут иметь отверстия или дублированные индексы для одного и того же продукта ...), вам придется изменить свою модель для сопоставления своих цен как <set> дочерних организаций (ISet<Price> Prices) с индексом, который вы будете обрабатывать своим кодом. (Заказная часть при загрузке данных может быть обработана атрибутом order-by="Order" на вашем set сопоставлении.)
Дублированные цены на продукт также будут различными рядами в БД, для обработки индекса, который будет отличаться. Таким образом, моя рекомендация использовать set, а не bag, так как дублированные цены будут действительно разными объектами.

Смежные вопросы