我在照片和标签之间有一个多对多的关系:一张照片可以有多个标签,而几张照片可以共享相同的标签。
我有一个循环扫描目录中的照片,然后将它们添加到 NHibernate。在此过程中,一些标签会添加到照片中,例如,当照片拍摄于 2009 年时,会添加 2009 年标签。
Tag 类实现 Equals 和 GetHashCode 并使用 Name 属性作为唯一的签名属性。Photo 和 Tag 都有代理键并且是版本化的。
我有一些类似于以下的代码:
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 在上述情况下只尝试在数据库中创建单个标签。我是否需要自己维护一个新添加标签的列表,或者我可以设置映射以使其工作?