との間の一方向の多対多の関係でRegistration
はItem
、aRegistration
には登録への参照があり、登録への参照はISet<Item> ItemsPurchased
ありItem
ません(オブジェクトグラフを調べるのに便利な方法ではありません)。生成されているSQLを見ると、次のようになります。
INSERT INTO Registrations_Items (RegistrationId, ItemId) VALUES (@p0, @p1);@p0 = 1 [Type: Int32 (0)], @p1 = 1 [Type: Int32 (0)]
UPDATE Items SET Price = @p0, Name = @p1, [...], ListIndex = @p5, EventId = @p6 WHERE ItemId = @p7
更新に渡されたパラメーターは正しいですが、アイテムについては何も変更されていないため、更新は必要ありません。
マッピングは、このオーバーライドを使用して自動マッピングしRegistration
、のオーバーライドはありませんItem
。DBスキーマは完全に正しいように見えます。すべての規則を削除して再度テストしたところ、動作が持続したため、これを行っているのは私のマッピング規則ではありません。
mapping.HasManyToMany(e => e.ItemsPurchased).AsSet().Cascade.All().Not.Inverse();
NHibernateがこのUPDATE
呼び出しを行うのはなぜですか?それを停止するにはどうすればよいですか?何も害はありませんが、何かおかしなことをしたことを示唆しているので、何を考えたいと思います。
編集:
以下のコメントごとに、Event
(Item
に属している必要がありますEvent
)を作成し、それに2Items
を追加し、セッションから最初のイベントを削除してセッションをフラッシュし、IDで最初のテストを取得する単体テストを作成しました。
下のSELECT項目の行(下から2番目)に何か奇妙なことに気づきました
INSERT INTO Events (blah blah blah...)
select @@IDENTITY
INSERT INTO Items (Price, Name, StartDate, EndDate, ExternalID, ListIndex, EventId) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6);@p0 = 100.42 [Type: Decimal (0)], @p1 = 'Item 1' [Type: String (0)], @p2 = NULL [Type: DateTime (0)], @p3 = NULL [Type: DateTime (0)], @p4 = '123' [Type: String (0)], @p5 = 0 [Type: Int32 (0)], @p6 = 1 [Type: Int32 (0)]
select @@IDENTITY
SELECT blah blah blah FROM Events event0_ WHERE event0_.EventId=@p0;@p0 = 1 [Type: Int32 (0)]
SELECT itemsforsa0_.EventId as EventId1_, itemsforsa0_.ItemId as ItemId1_, itemsforsa0_.ListIndex as ListIndex1_, itemsforsa0_.ItemId as ItemId3_0_, itemsforsa0_.Price as Price3_0_, itemsforsa0_.Name as Name3_0_, itemsforsa0_.StartDate as StartDate3_0_, itemsforsa0_.EndDate as EndDate3_0_, itemsforsa0_.ExternalID as ExternalID3_0_, itemsforsa0_.ListIndex as ListIndex3_0_, itemsforsa0_.EventId as EventId3_0_ FROM Items itemsforsa0_ WHERE itemsforsa0_.EventId=@p0;@p0 = 1 [Type: Int32 (0)]
UPDATE Items SET Price = @p0, Name = @p1, StartDate = @p2, EndDate = @p3, ExternalID = @p4, ListIndex = @p5, EventId = @p6 WHERE ItemId = @p7;@p0 = 100.42000 [Type: Decimal (0)], @p1 = 'Item 1' [Type: String (0)], @p2 = NULL [Type: DateTime (0)], @p3 = NULL [Type: DateTime (0)], @p4 = '123' [Type: String (0)], @p5 = 0 [Type: Int32 (0)], @p6 = 1 [Type: Int32 (0)], @p7 = 1 [Type: Int32 (0)]
テーブルは正しく作成されます。
create table Items (
ItemId INT IDENTITY NOT NULL,
Price NUMERIC(19,5) not null,
Name NVARCHAR(255) not null,
StartDate DATETIME null,
EndDate DATETIME null,
ExternalID NVARCHAR(255) not null,
ListIndex INT not null,
EventId INT not null,
primary key (ItemId)
)
アイテムは日付固有である必要がない場合があるため、DateTimesは意図的にnull許容になります(「早期登録」などの例)。