Изучив эту проблему и прочитав ответ от AlexCuse (+1 к его ответу), я решил, что в этом случае невозможно использовать собственный генератор идентификаторов.Мне и нужны были модульные тесты, чтобы работать при сохранении строк с известными идентификаторами в тестовых настройках и вставке тестов с автоматически сгенерированными идентификаторами.
Один из вариантов состоял в том, чтобы иметь какую-то проверку в отображении с текучей средой, которая использовала бы GeneratedBy.Native("SEQUENCENAME")
в производствекод и GeneratedBy.Assigned
в тестах, но мне не понравилась идея иметь различия, связанные с отображениями NHibernate между модульными тестами и производством.
В конце концов я решил обработать это в репозитории.У меня есть метод Add
в соответствующем хранилище, и он будет обрабатывать назначение сгенерированного идентификатора из последовательности, если идентификатор еще не установлен, что-то вроде этого:
public void Add(TheClass newObject) {
if (newObject.Id == 0) {
newObject.Id = sequenceGenerator.GetNextValue("SEQUENCENAME");
}
session.Save(newObject);
}
В модульных тестах я вставлюгенератор фиктивных последовательностей в хранилище.Можно утверждать, что это похоже на подход с использованием разных отображений для модульных тестов и производственного кода, но я думаю, что этот подход делает разницу немного более изолированной.Однако наиболее важной причиной является то, что она позволяет использовать как назначенные, так и автоматически генерируемые идентификаторы также в модульных тестах.