У меня есть отношение многие ко многим между фотографиями и тегами: фотография может иметь несколько тегов, и несколько фотографий могут использовать одни и те же теги.
У меня есть цикл, который сканирует фотографии в каталоге, а затем добавляет их в 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 пытается создать только один тег в базе данных в описанной выше ситуации. Нужно ли вести список вновь добавленных тегов самостоятельно или я могу настроить отображение таким образом, чтобы оно работало?