В моей модели домена пользователь связан со многими местами - отношения моделируются с помощью класса UserPlace и сопоставления (с FluentNHibernate) следующим образом (у пользователя есть коллекция UserPlace, которая называется Neighborhood :
public class UserMap : ClassMap<User>
{
HasMany(x => x.Neighbourhood)
.Component(c =>
{
c.Map(x => x.IsDefault).Not.Nullable();
c.Map(x => x.Selected).Not.Nullable().Default("0");
c.References(x => x.Place).Fetch.Join();
}
).Not.LazyLoad().Cascade.SaveUpdate();
}
Всякий раз, когда я изменяю любую сущность UserPlace, принадлежащую пользователю, и затем сохраняю пользователя в БД, все строки UserPlace для этого пользователя удаляются, а затем повторно вставляются .
Я предполагаю, что это потому, что NHibernate не знает, как однозначно идентифицировать один из этих рядов из другого. Другими словами, компонент в моем отображении не имеет ключа как такового.
Первичный ключ может быть сформирован путем объединения столбцов User_id и Place_id в таблице, в которой хранятся отношения между этими двумя объектами. Как я могу настроить этот ключ, используя Fluent? И решит ли это поведение удаления и повторной вставки, которое я наблюдаю?
РЕДАКТИРОВАТЬ: Я спросил об этом в NHUsers, и Фабио Мауло предложил использовать IdBag. Насколько я могу судить, это не поддерживается в Fluent NHibernate, а компоненты не позволяют идентификаторы. Как еще можно сопоставить это отношение "многие ко многим" и предотвратить проблему удаления всех повторных вставок всех?
РЕДАКТИРОВАТЬ 2: Вот таблицы, которые NH генерирует на основе моих отображений
CREATE TABLE [dbo].[User](
[Id] [uniqueidentifier] NOT NULL,
--- a bunch of unimportant fields
CONSTRAINT [PK__User] PRIMARY KEY CLUSTERED ([Id] ASC))
CREATE TABLE [dbo].[Neighbourhood](
[User_id] [uniqueidentifier] NOT NULL,
[IsDefault] [bit] NOT NULL,
[Place_id] [int] NOT NULL,
[Selected] [bit] NOT NULL)
CREATE TABLE [dbo].[Place](
[Id] [int] IDENTITY(1000,1) NOT NULL,
--- a bunch of unimportant fields
CONSTRAINT [PK_Place] PRIMARY KEY CLUSTERED ([Id] ASC))
Существует отношение FK между User.Id и Neighbourhood.User_Id и между Neighbourhood.Place_id и Place.Id