NHibernate Отображение таблицы, если первичный ключ также является внешним ключом - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть 2 таблицы следующим образом:

create table Users
(
 UserId int primary key identity not null
)

create table UserExternalKeys
(
 UserIdRef int primary key not null,
 ExternalKey varchar(50) unique not null
)

alter table UserExternalKeys
add constraint fk_UsersExternalKeys_Users
foreign key (UserIdRef)
references Users (UserId)

Каждый пользователь может иметь 0 или 1 внешнюю клавишу.Все настроено таким образом, потому что добавление уникального столбца с нулем в SQL Server не допускает более 1 пустого значения.

Основано на пост Айенде , кажется, что это можно обработать, используя<one-to-one> картирование.Однако для этого у таблицы UserExternalKeys должен быть собственный первичный ключ.

Новая схема будет выглядеть примерно так:

create table Users
(
    UserId int primary key identity not null,
    ExternalKeyRef int null
)

create table UserExternalKeys
(
    UserExternalKeyId int primary key identity not null,
    ExternalKey varchar(50) unique not null
)

alter table Users
add constraint fk_Users_UsersExternalKeys
foreign key (ExternalKeyRef)
references UserExternalKeys (UserExternalKeyId)

Я думаю, что это сработает, но кажется,как я бы только добавил столбец UserExternalKeyId, чтобы успокоить NHibernate.

Есть предложения?

1 Ответ

2 голосов
/ 01 декабря 2010

Если у пользователя может быть 0 или 1 внешняя клавиша, почему бы не спроектировать таблицы как:

create table Users
(
    UserId int primary key identity not null
    ExternalKey varchar(50) null
)

и использовать один из известных способов решения этой проблемы.Если вы используете SQL Server 2008, вы можете использовать отфильтрованный индекс .Если вы используете более раннюю версию, вы можете использовать триггер, индексированное представление (2005) или обходной путь nullbuster .

. Вы также можете сохранить исходную схему и отобразить связь какодин-ко-многим от Пользователей до UserExternalKeys.Сопоставьте коллекцию как частный член и предоставьте доступ к ней через свойство:

private IList<UserExternalKeys> _externalKeys;

public string ExternalKeys
{
    get
    {
        if (_externalKeys.Count() == 1) 
        {
            return _externalKeys.ElementAt(0).ExternalKey;
        }
        else
        {
            // return null or empty string if count = 0, throw exception if > 1
        }
    }
    set
    {
        if (_externalKeys.Count() == 0) { // add key and set value }
        else { // set value if count = 1, throw exception if > 1 } 
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...