Хранить набор целочисленных значений в Sql Server 2005 с помощью nHibernate? - PullRequest
1 голос
/ 29 июня 2010

Каков наилучший способ сохранить и отобразить сущность, которая содержит набор Integer в качестве одного из своих атрибутов?Я использую nHibernate поверх Sql Server 2005.

Поможет ли здесь создание пользовательского типа CLR?Если да, как это можно отобразить с помощью nHibernate?

Я должен иметь возможность запрашивать на множестве.Например,

select myEntity from MyEntities where myEntity.Integers = SetOf(2, 4, 5)

1 Ответ

2 голосов
/ 29 июня 2010

Принимая этот класс

class MyEntity
{
  //...
  public IList<int> Integers { get; private set; }
}

Просто отобразите это как набор.

<class name="MyEntity">
  <!-- ... -->
  <set name="Integers" table="MyEntity_Integers">
    <key column="MyEntity_FK"/>
    <element type="Int32" column="Value"/>
  </set>
</class>

Вы можете попробовать отфильтровать коллекцию по:

from MyEntity e 
where e.Integers in (:set) 
  and size(e.Integers) = :setSize

Это, вероятно, не очень быстро.


Совершенно другой подход: хранить целые числа в некоторой сериализованной форме в одном текстовом поле.

Вы можете написать свой собственный пользовательский тип NHibernate. Сортируйте целые числа перед сохранением. Вы можете хранить их в формате, подобном "2;45;78;898". Фильтрация будет очень быстрой, потому что она просто соответствует строке. Изменить коллекцию в базе данных может быть сложно. Другая проблема заключается в том, что длина столбца ограничена.

Вот пример реализации типа пользователя NHibernate.

...