在我的域模型中,用戶與許多位置關聯 - 通過UserPlace類和映射(與FluentNHibernate)建立關係,如下所示(用戶擁有UserPlace的集合稱爲鄰居:在修改與NHibernate的多對多關係時防止刪除/插入
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這件事,Fabio Maulo建議使用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))
有User.Id和Neighbourhood.User_Id之間和Neighbourhood.Place_id和Place.Id
之間的關係FK
它可以幫助顯示用於創建有問題的表的sql。我很難想象這些表格。這聽起來像你需要在UserPlace的映射中的複合ID。如果我能看到表格,爲您提供備用映射可能會更容易。 – 2011-04-24 23:16:20
感謝您的評論。我已經用表格定義更新了這個問題(爲了簡潔起見,我剪掉了非重要的列) – 2011-04-25 13:33:16