Свободный NHibernate - HasManyToMany с несколькими ChildKeyColumns возможно? - PullRequest
2 голосов
/ 13 января 2011

У меня есть два вида сущностей, комментарии и задачи. Оба типа могут быть добавлены в закладки пользователем. Итак, я создал таблицу под названием «Закладки»:

CREATE TABLE [dbo].[Bookmarks] (
[ID] [int] IDENTITY(1,1) NOT NULL,
[FKUserID] [int] NOT NULL,
[FKCommentID] [int] NULL,
[FKTaskID] [int] NULL)

Отображение этих отношений для моей сущности User выглядит следующим образом:

var bookmarks = Component(x => x.Bookmarks, x => x.HasManyToMany(b => b.Comments)
.Table("Bookmarks")
.Access.CamelCaseField()
.ParentKeyColumn("FKUserID")
.ChildKeyColumn("FKCommentID")
.AsBag()
.LazyLoad());

bookmarks.HasManyToMany(b => b.Tasks)
    .Table("Bookmarks")
    .Access.CamelCaseField()
    .ParentKeyColumn("FKUserID")
    .ChildKeyColumn("FKTaskID")
    .AsBag()
    .LazyLoad();

Я думаю, что все будет работать хорошо, но не тогда, когда объекты базы данных создаются с нуля из самого NHibernate. Тогда я получаю приятное сообщение об ошибке

NHibernate.Exceptions.GenericADOException: не удалось вставить коллекцию: [Domain.Model.User.Domain.Model.User.Bookmarks.Tasks # 1] [SQL: INSERT INTO закладки (FKUserID, FKTaskID) VALUES (@ p0, @ р1)] ----> System.Data.SqlClient.SqlException: невозможно вставить значение NULL в столбец «FKCommentID», таблица «xyzautomatedtests.dbo.Bookmarks»; столбец не допускает пустых значений. Вставить не удается. Заявление было прекращено.

Конечно, я мог бы использовать две таблицы вместо этой, но разве нет способа запустить это? К сожалению, я не могу найти способ установить эти два дочерних столбца в конфигурации как обнуляемые.

Есть подсказки?

1 Ответ

2 голосов
/ 23 августа 2011

Дважды проверьте определение таблицы. Исключение SQLException происходит непосредственно из базы данных, поэтому проблемы, с которыми вы сталкиваетесь, связаны с базой данных, а не с .Net.

Просто убедитесь, что столбец FKCommentID в вашей таблице закладок действительно имеет значение Nullable.

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