Предотвращение удаления / вставки при изменении отношения многие ко многим с помощью NHibernate - PullRequest
2 голосов
/ 20 апреля 2011

В моей модели домена пользователь связан со многими местами - отношения моделируются с помощью класса 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

Ответы [ 2 ]

1 голос
/ 25 апреля 2011

Вы можете отобразить эти отношения следующим образом, чтобы избежать сценария, с которым вы работаете:

public class UserMap : ClassMap<User>
{
    HasMany(x => x.Neighbourhood)
      .KeyColumn("User_id")
      .Not.LazyLoad().Cascade.SaveUpdate();
}

public class NeighborHoodMap : ClassMap<NeighborHood>
{
    Table("Neighbourhood");
        CompositeId()
            .KeyReference(x => x.User, "User_id")
            .KeyReference(x => x.Place, "Place_id");

    Map(x => x.IsDefault).Not.Nullable();
    Map(x => x.Selected).Not.Nullable().Default("0");
}

Тогда класс соседства будет выглядеть примерно так:

0 голосов
/ 24 апреля 2011

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

Просто идея.

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