1

我问过如何在 SQL Server 中使用视图时注入存储过程支持。

使用数据库视图时如何在 NHibernate 中使用存储过程进行创建/更新

这是一个映射文件:

    <sql-insert>
        exec sp_cycle_insert ?,?,?
    </sql-insert>
    <sql-update>
        exec sp_cycle_update ?,?,?,?,?,?
    </sql-update>
    <sql-delete>
        raiserror ('Cycle can not be deleted', 10, 1)
    </sql-delete>

所以,我已经完成了重构等,并且我运行了我的测试....都失败了。

原因是 SQL Server 具有视图和存储过程,而每次运行测试时,我都会从头开始设置数据库:

        new SchemaExport(configuration).Execute(false, true, false);

我想到了可能的解决方案,这里有:有没有办法:

  • 使用数据库所需的东西(如存储过程、视图等)运行其他脚本(我想这是解决方案)

另一方面,运行脚本可能会失败(目前我使用 sdf 文件,但如果我将来更改为不同的提供程序怎么办?)。此外,过程/视图使用WITH构造以及测试期间使用的数据库不支持的一些SQL Server 2005 函数。

  • . 所以我认为是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性,NHibernate 使用以下方法访问支持字段:

access="nosetter.camelcase"

如果我切换到模拟存储库,我将负责在代码中实现视图的逻辑。还有其他解决方案吗?还是我有大麻烦!?

4

1 回答 1

1

使用数据库所需的东西(如存储过程、视图等)运行其他脚本(我想这是解决方案)

为此使用 IAuxiliaryDatabaseObject 对象。它将包含使用 SchemaExport 创建/删除架构时要运行的额外脚本。您传递给您的 NH 配置对象 (AddAuxiliaryDatabaseObject) 的这个/这些对象。

所以我认为是时候模拟存储库了。但在这里我也看到了障碍:视图计算一些只读属性和 NHibernate 访问支持字段使用

你应该两者都做。对你的真实数据库进行集成测试,以验证你的基础设施/DAL/无论你怎么称呼它层工作。在更高的层中,您可能想要编写单元测试,而不是模拟存储库之类的东西。如果我正确理解您的问题,您在设置测试状态时遇到问题,因为某些数据在您的实体上是私有的?这并不是由 NH/repos/data access 引起的真正“问题”,而是一个普遍问题。有不同的方法可以解决这个问题,你可以;放宽您的 API 以使其更具可测试性,让 ctor 接受所有数据,以一种或另一种方式使用反射,让您的实体的接口是只读的,但它的实现具有设置器等等等。很难给出一般性建议,但尝试找到一个适合您情况的方式。

于 2012-08-28T17:55:39.547 回答