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

Я использую 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 или беглым файлом карты?

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

Ответы [ 2 ]

2 голосов
/ 26 января 2009

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");
0 голосов
/ 26 января 2009

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

<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>

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

...