Составной идентификатор, содержащий нулевое значение в NHibernate - PullRequest
4 голосов
/ 15 марта 2012

У меня есть ситуация, когда у меня есть таблица с 3 столбцами, которые содержат идентификаторы, ссылающиеся на разные таблицы.В дополнение к этим 3 столбцам у меня есть несколько столбцов с некоторыми свойствами.

Допустим, что 3 столбца - это Foo, Bar, Baz.Foo никогда не является нулевым, и точно один из Bar, Baz является нулевым.

Моя сущность и отображение выглядят следующим образом (имейте в виду, что я хотел упростить ситуацию):

public class FooBarBaz
{
    public virtual Foo Foo { get; set; }
    public virtual Bar Bar { get; set; }
    public virtual Baz Baz { get; set; }
    public virtual string Prop { get; set; }

    public override bool Equals(Object obj)
    {
        /* checks for nulls etc. in the end
        returns Foo == obj.Foo && Bar == obj.Bar && Baz == obj.Baz */
    }

    public override int GetHashCode()
    {
        /* builds unique string for (Foo,Bar,Baz)
        taking nulls into account and gets it's hashcode */
    }
}

public class FooBarBazMap : ClassMap<FooBarBaz>
{
    public FooBarBazMap()
    {
        CompositeId()
            .KeyReference(x => x.Foo, "Foo_Id")
            .KeyReference(x => x.Bar, "Bar_Id")
            .KeyReference(x => x.Baz, "Baz_Id");
        Map(x => x.Prop);
    }
}

Я создал вручную строку, в которой все три столбца не равны NULL, и это отображение работает совершенно нормально.Но моя логика приложения основана на том факте, что всегда один из двух (Bar, Baz) является нулем, и в этой ситуации NHibernate возвращает значение NULL как сущность FooBarBaz.

Как мне преодолеть эту проблему?Разрешает ли NHibernate нулевые значения в CompositeId?

1 Ответ

4 голосов
/ 16 марта 2012

nhibernate - это абстракция поверх реляционных баз данных, а реляционные базы данных не допускают нулевые значения в столбцах первичного ключа (фактически все столбцы pk не имеют нулевых ограничений).

Предполагая, что эта таблица является связующим звеном между 3 объектами, я бы отобразил ее как компонент. Если вы разместите связь между Foo bar и baz, я могу привести пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...