Я использую Fluent NHibernate в проекте с базой данных Oracle 10g. Я также использую SQLite со схемой, сгенерированной из моего отображения для тестирования. Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку первичные ключи в моих таблицах генерируются Oracle Sequence, для правильной работы методов Add мне пришлось добавить .GeneratedBy.Sequence ({sequence name}) в поле Id каждого мои сопоставления, так что сопоставления выглядят примерно так:
public CustomerMap()
{
Id(x => x.Id)
.Column("Cust_Id")
.GeneratedBy.Sequence("SEQ_CONTNT_AREA");
...
{More Mapping Code}
...
}
После того, как я добавил GeneratedBy.Sequece в мои отображения, все мои тесты начали терпеть неудачу, давая мне следующие ошибки:
----> NHibernate.MappingException : could not instantiate id generator
----> NHibernate.MappingException : Dialect does not support sequences
Эти ошибки имеют смысл для меня, поскольку SQLite не использует последовательности Oracle для генерации первичного ключа. Однако, если я изменю свое сопоставление на использование GeneratedBy.Native (), все мои тесты пройдут, но при запуске приложения при попытке вставить новую запись я получу следующую ошибку:
InnerException = {System.Data.OracleClient.OracleException: ORA-02289: sequence does not exist
at System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
at System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle stateme...
Message: "could not get next sequence value[SQL: select hibernate_sequence.nextval from dual]" string
Это сообщение об ошибке указывает мне, что NHibernate либо не смог найти последовательность, необходимую для создания первичного ключа для этой таблицы, либо он даже не искал ее. В любом случае кажется, что он пытается использовать «hibernate_sequence» для получения значения, которое он явно не может найти, поскольку его не существует.
Я полагаю, что, возможно, мне не хватает чего-то довольно простого из-за того, что я довольно плохо знаком с NHibernate. Очень важно, чтобы я скоро заработал и на тестах, и на коде, так как я передам этот проект кому-то еще, у кого еще меньше опыта NHibernate, чем когда я уйду на свою новую работу на следующей неделе.