Как создать файл сопоставления NHibernate для многозначного компонента, представляющего собой уникальный набор столбцов?

Я использую NHibernate и Fluent NHibernate для создания файла сопоставления для объекта домена (хотя мне все равно, использует ли ответ свободный синтаксис NHibernate или xml hbm). И у меня возникли проблемы с выяснением того, как я указываю, что набор столбцов, представляющих компонент в доменном объекте, является уникальным.

Вот объект домена:

public class SpaceLocation
{
        public SpaceCoordinate Coordinates { get; set; }
        public SpaceObject AtLocation { get; set; }
}

и вот компонент, с которым у меня проблемы:

public struct SpaceCoordinate
{
        public int x { get; set; }
        public int y { get; set; }
        public int z { get; set; }
}

Не беспокойтесь о SpaceObject AtLocation для целей этого вопроса.

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

Чтобы дать вам представление о направлении, в котором я пытаюсь двигаться, я покажу вам, что у меня есть для класса сопоставления:

public class SpaceLocationMap : ClassMapWithGenerator<SpaceLocation>
    {
        public SpaceLocationMap()
        {

            Component<SpaceCoordinate>(x => x.Coordinates, m => 
            {
                m.Map(x => x.x);
                m.Map(x => x.y);
                m.Map(x => x.z);
            });
        }
    }

Проблема с этим сопоставлением Fluent NHibernate заключается в том, что оно не применяет уникальное ограничение к значениям SpaceCoordinate вместе. Имейте в виду, что я не пытаюсь сделать каждую из них уникальной по отдельности, это было бы слишком ограничительно.

Итак, как бы вы сопоставили это с помощью файла карты hbm или fluent?

Любая помощь будет принята с благодарностью, спасибо за чтение!


person Mark Rogers    schedule 26.01.2009    source источник


Ответы (2)


m4bwav был правильным с отображением hbm; однако Fluent NHibernate не поддерживал это в то время, когда вы писали свой вопрос. Я только что внес исправление, которое добавляет метод Unique к сопоставлению компонентов.

Component<SpaceCoordinate>(x => x.Coordinates, m => 
{
  m.Map(x => x.x);
  m.Map(x => x.y);
  m.Map(x => x.z);
}).Unique();

Поэтому вам нужно обновить свою копию Fluent NHibernate. Если по какой-то причине вы не можете этого сделать, вы можете использовать метод SetAttribute, чтобы взломать его.

Component<SpaceCoordinate>(x => x.Coordinates, m => 
{
  m.Map(x => x.x);
  m.Map(x => x.y);
  m.Map(x => x.z);
}).SetAttribute("unique", "true");
person James Gregory    schedule 26.01.2009
comment
С последней версией NHibernate (3.3.1.4000) / Fluent NHibernate (1.3.0.733) он не работает (в этом примере все свойства virtual и struct = ›class). Также больше нет SetAttribute. Я могу задать другой вопрос и связать его здесь. - person dzendras; 06.02.2013

Я считаю, что ответ примерно такой:

<class name="SpaceLocation" table="SpaceLocation">
    <property name="AtLocation" type="SpaceObject"/>
    <component name="Coordinates" class="SpaceCoordinate" unique="true">
        <property name="x"/>
        <property name="y"/>
        <property name="z"/>
    </component>
</class>

Но я еще не проверял. Теперь, как это сделать в свободном спящем режиме?

person Mark Rogers    schedule 26.01.2009
comment
Вам лучше добавить это как исправление к вашему вопросу. Это не ответ, и, как правило, он противоречит практике SO - ответы должны быть только реальными; Пояснения к вопросам необходимо добавлять с помощью кнопки редактирования. - person Ivaylo Slavov; 14.02.2012