我在具有Oracle 10g数据库的项目上使用Fluent NHibernate。我也使用SQLite和我的映射生成的模式进行测试。我遇到的问题是,由于我的表上的主键是由Oracle Sequences生成的,为了使我的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 Sequences进行主键生成。但是,如果我将映射更改为使用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的经验比我下周离开新工作时更少。
答案 0 :(得分:3)
我知道这是一个巨大的黑客攻击,但你可以这样做吗?
public CustomerMap()
{
if (SomeStaticClass.IsRunningUnitTests)
{
Id(x => x.Id)
.Column("Cust_Id")
.GeneratedBy.Native();
}
else
{
Id(x => x.Id)
.Column("Cust_Id")
.GeneratedBy.Sequence("SEQ_CONTNT_AREA");
}
...
{More Mapping Code}
...
}