Свободное владение NHibnernate HasManyToMany с индексом

Я пытаюсь сопоставить коллекцию «многие ко многим» с помощью Fluent NHibnernate. У моего модельного класса есть это свойство:

public virtual IList<Resource> Screenshots
{
    get { return _screenshots; }
    protected set { _screenshots = value; }
}

И мое беглое отображение:

HasManyToMany(x => x.Screenshots)
                .AsList(x => x.WithColumn("Index"))
                .Cascade.AllDeleteOrphan();

Когда я запускаю свое приложение, я получаю следующее сообщение об исключении:

Элемент list в пространстве имен urn: nhibernate-mapping-2.2 имеет недопустимый дочерний элемент many-to-many в пространстве имен urn: nhibernate-mapping-2.2. Ожидается список возможных элементов: 'index, list-index' в пространстве имен 'urn: nhibernate-mapping-2.2'.

Должен быть способ сделать это. Кто-нибудь знает, что я делаю не так?


person EisenbergEffect    schedule 14.03.2009    source источник
comment
Используете ли вы таблицу ссылок для своих отношений "многие ко многим"?   -  person gcores    schedule 15.03.2009
comment
С тех пор я обнаружил, что это ошибка в Fluent NHibnernate. Это задокументировано как исправленное в последней сборке.   -  person EisenbergEffect    schedule 25.04.2009
comment
Вы можете сами ответить на этот вопрос, указав ссылку на этот отчет об ошибке и любые соответствующие номера версий.   -  person Jon Adams    schedule 26.01.2011


Ответы (1)


Текущий синтаксис FluentNHibernate для этого выглядит следующим образом:

HasManyToMany(x => x.Screenshots)
    .AsList(i => i.Column("`Index`"));

По умолчанию столбец индекса имеет значение «Индекс», но это зарезервированное слово в SQL Server (и, возможно, в других базах данных тоже), поэтому вы должны указать его в кавычках.

Кроме того, я бы не рекомендовал устанавливать каскад для этих отношений. Рассмотрим следующий код:

x.Screenshots.Remove(s);
session.SaveOrUpdate(x);

NHibernate правильно удалит строки из таблицы связывания даже без указанного каскада. Однако, если вы укажете AllDeleteOrphan, NHibernate удалит строку из таблицы связывания, а также удалит ресурс s. Я сомневаюсь, что это то поведение, которое вам нужно в отношениях «многие ко многим».

person Daniel Schilling    schedule 07.05.2011