我在照片和標籤之間有多對多的關係:照片可以有多個標籤,多張照片可以共享相同的標籤。在NHibernate中與多對多關係使用哪種算法
我有一個循環掃描目錄中的照片,然後將它們添加到NHibernate。在該過程中,一些標籤被添加到照片中,例如, 2009年拍攝照片時的2009年標籤。
Tag類實現Equals和GetHashCode,並使用Name屬性作爲唯一的簽名屬性。照片和標籤都有替代鍵和版本。
我有類似下面的一些代碼:
public void Import() {
...
foreach (var fileName in fileNames) {
var photo = new Photo { FileName = fileName };
AddDefaultTags(_session, photo, fileName);
_session.Save(photo);
}
...
}
private void AddDefaultTags(…) {
...
var tag =_session.CreateCriteria(typeof(Tag))
.Add(Restriction.Eq(「Name」, year.ToString()))
.UniqueResult<Tag>();
if (tag != null) {
photo.AddTag(tag);
} else {
var tag = new Tag { Name = year.ToString()) };
_session.Save(tag);
photo.AddTag(tag);
}
}
我的問題是當標籤不存在,例如新年的第一張照片。 AddDefaultTags方法檢查標籤是否存在於數據庫中,然後創建它並將其添加到NHibernate中。這在添加單張照片時效果很好,但是在新年和同一工作單元中導入多張照片時,它會失敗,因爲它仍然不存在於數據庫中,並且會再次添加。當它完成工作單元時,它會失敗,因爲它試圖在標籤表中添加兩個具有相同名稱的條目...
我的問題是如何確保NHibernate只嘗試在數據庫中創建單個標籤以上情況。我是否需要自己維護新添加的標籤列表,還是可以以這種方式設置映射?
對不起,我沒有很好地解釋那部分。我的FlushMode設置爲從不。我在一個工作單位內工作,在完成工作時我會做一個明確的刷新。哦,並且在交易中運行。 – HakonB 2009-05-04 07:31:17