NHibernate ISession.Peplicate с SQLite и генерацией собственных идентификаторов - PullRequest
1 голос
/ 09 февраля 2011

Мы отображаем первичный ключ объекта следующим образом:

Id(x => x.Id, "ID").GeneratedBy.Native("SEQUENCENAME");

У нас есть бизнес-логика, зависящая от определенных идентификаторов (устаревших, их нелегко изменить).Новые объекты должны получать сгенерированные идентификаторы из последовательности Oracle, но всегда есть строки с известными идентификаторами.

Мы используем SQLite для модульного тестирования, и мне нужно сохранить новые объекты в базе данных в памяти с этими известнымиидентификаторы.Это не будет работать ни с одним из следующих методов:

session.Replicate(objectWithKnownId, <any replication mode>);
session.Merge(objectWithKnownId)

В соответствии с документацией nHibernate, метод Replicate, похоже, является тем, что я ищу.

Сохранять все достижимые временные объекты, повторно используя текущие значения идентификатора.

Однако при использовании его с SQLite я получу только сгенерированные идентификаторы.Кто-нибудь может придумать хороший способ решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Я обычно запускаю любые тесты базы данных для базы данных, с которой запускаю приложение - SQLite может быть полезен для быстрых тестов, но ему просто не хватает слишком многих функций, которые вы найдете в полнофункциональной СУБД.Вы можете использовать метод, подобный тому, который обсуждался здесь , для настройки ваших отображений во время выполнения, если это проблема отображения.

Вы также можете предварительно загрузить базу данных SQLite с необходимыми вам сущностямии скопируйте его для повторного использования при каждом запуске теста.Вероятно, я бы выбрал этот путь для чего-то подобного, но я не могу предложить никаких технических подробностей о том, как это сделать.

Если честно, звучит немного странно, если ваша бизнес-логика зависит от определенных факторов.Идентификаторы - я думаю, вы хотите, чтобы они зависели от определенных сущностей - вы могли бы затем вставить эти сущности и сохранить их сгенерированные идентификаторы на время ваших тестов.

0 голосов
/ 11 февраля 2011

Изучив эту проблему и прочитав ответ от 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);
}

В модульных тестах я вставлюгенератор фиктивных последовательностей в хранилище.Можно утверждать, что это похоже на подход с использованием разных отображений для модульных тестов и производственного кода, но я думаю, что этот подход делает разницу немного более изолированной.Однако наиболее важной причиной является то, что она позволяет использовать как назначенные, так и автоматически генерируемые идентификаторы также в модульных тестах.

...