运行测试时由Mappings中的GeneratedBy语句引起的错误

时间:2009-11-30 16:12:56

标签: nhibernate fluent-nhibernate nhibernate-mapping

我在具有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的经验比我下周离开新工作时更少。

1 个答案:

答案 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}
    ...
}