我有兩個實體Password和PasswordHash。密碼包含一組PasswordHashes(這些是具有不同掩碼的哈希)。NHibernate使用Cascade進行刪除操作導致N + 1刪除
當我刪除密碼時,我希望所有關聯的密碼哈希也被刪除。
我不喜歡這樣的映射:
mapping.HasMany(x => x.PasswordHashes)
.Cascade
.All()
.Inverse()
.ReferencedBy(x => x.Password);
我預計將產生的兩個查詢:
DELETE FROM "PasswordHash" WHERE "IdPassword" = :p0
和明顯
DELETE FROM "Password" WHERE "IdPassword" = :p0
相反NHibernate的產生的N + 1的查詢像這樣:
DELETE FROM "PasswordHash" WHERE "IdPasswordHash" = :p0 (N)
和
DELETE FROM "Password" WHERE "IdPassword" = :p0 (1)
我怎樣才能改變這種行爲,以更優?
編輯:代碼刪除:
session.Delete(password);
session.Flush();
您可以給出導致N + 1刪除的代碼嗎? – mickfold 2013-03-21 10:18:37
我想這個,你用來執行刪除的代碼,可能是有趣的:http://www.nhforge.org/doc/nh/en/index.html#performance-collections-oneshotdelete – jbl 2013-03-21 12:29:33
刪除HQL兒童(第一次旅行),然後刪除父母?您還使用哪個數據庫供應商? – Rippo 2013-03-21 14:52:13