2011-01-20 2 views
3

Итак, у меня есть две таблицы, назовите их «Пользователь и элемент». Я хочу, чтобы каждый пользователь мог отмечать (например, «смотреть» вещи в юниверсе Google) на любой элемент.Хранение простого отношения без явного идентификатора

Теперь, исходя из теоретико-множественного подхода, разумно хранить это как простую связь между пользователями и элементами. Вызовите эту новую таблицу UserItemFlags. Таблица должна иметь две колонки; один с внешними ключами в таблице User, другой с внешними ключами в таблицу Item. Если пользовательский флажок U указывает на элемент I, это затем представляется наличием строки (U, I) в таблице UserItemFlags.

Теперь моя проблема с выражением этого в Fluent-NHibernate заключается в следующем: я не могу понять, что делать с отображением Id. В идеале у меня не было бы идентификатора, потому что нет ничего более, чем наличие или отсутствие этой связи между Пользователем и Элементом. Естественным следствием этой модели является невозможность дублирования строк в таблице. Это желаемая функция.

using FluentNHibernate.Mapping; 

public class UserItemFlagsMapping : ClassMap<UserItemFlags> 
{ 
    public UserItemFlagsMapping() 
    { 
     // Aaaa! I must have an Id! 
     References(x => x.User).Not.Nullable(); 
     References(x => x.Item).Not.Nullable(); 
    } 
} 

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

ответ

2

Что вы имеете в виду вы не имеете ID? У вас есть составной идентификатор с идентификатором пользователя и идентификатором элемента.


Edit: Ответ на этот комментарий: метод

Идентификатор() предназначен только для одиночных ключей столбец первичных. Вместо этого вы хотите использовать CompositeId(). Что-то вроде следующего: CompositeId(). KeyReference (x => x.User, "user_id"). KeyReference (x => x.Item, "item_id"; Очевидно, что если вы используете сопоставление по умолчанию по умолчанию, t нужны имена столбцов.

+0

Да, я согласен Но Fluent-NHibernate не согласен. Мне нужно вызвать 'Id'-метод на ClassMap <...>' для Fluent, чтобы понять его. –

+2

Метод Id() предназначен только для первичных ключей с одним столбцом. Вместо этого вы хотите использовать CompositeId(). Что-то вроде следующего: CompositeId(). KeyReference (x => x.User, "user_id"). KeyReference (x => x.Item, "item_id"; Очевидно, повторное использование сопоставления по умолчанию по умолчанию, вы не нужны имена столбцов. – Rich

1

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

Таблицы «многие-ко-многим» создаются только как коллекция на обеих сторонах отношений. Таким образом, вы будете иметь:

User.Items и Item.Users

Добавление элемента в коллекции будет создавать строки внутри отображение таблицы UserItemFlags.

Смотрите также: http://marekblotny.blogspot.com/2009/02/fluent-nhbernate-and-collections.html

Давиде

+0

А, справедливо. Однако я бы хотел, чтобы у вас не было списков в этих классах, так как оно не совпадает с тем, как я буду использовать данные вообще :( –

Смежные вопросы