Хранение простого отношения без явного идентификатора - PullRequest
3 голосов
/ 20 января 2011

Итак, у меня есть две таблицы, назовите их User и Item.Я хочу, чтобы каждый пользователь мог помечать (например, «пялиться» вещи во вселенной 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();
    }
}

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

Ответы [ 2 ]

2 голосов
/ 21 января 2011

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


Редактировать: Ответ в этом комментарии:

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

1 голос
/ 20 января 2011

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

Таблицы "многие ко многим" просто создаются как коллекция на двух сторонах отношения. Итак, у вас будет:

User.Items и Item.Users

Добавление элемента в коллекцию создаст строки в таблице сопоставления UserItemFlags.

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

Davide

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