使用nHibernate进行集成测试

时间:2018-05-17 21:48:44

标签: c# asp.net-core nhibernate

好的,这是合约。

我在ASP.NET Core中有一个webApi项目,它使用nHibernate引用项目int .NET Framework。

我想设计一些集成测试,但我无法找到连接SQLite驱动程序的方法。

我最终得到了类似的东西:

Configuration = new NHibernate.Cfg.Configuration();

IDictionary<string, string> properties = new Dictionary<string, string>
{
    // Setup database connection
    {NHibernate.Cfg.Environment.ConnectionProvider, "NHibernate.Connection.DriverConnectionProvider"},
    {NHibernate.Cfg.Environment.Dialect, "NHibernate.Dialect.SQLiteDialect"},
    {NHibernate.Cfg.Environment.ConnectionDriver, "MilestoneTG.NHibernate.Driver.Sqlite.Microsoft.MicrosoftSqliteDriver, MilestoneTG.NHibernate.Driver.Sqlite.Microsoft"},
    {NHibernate.Cfg.Environment.ConnectionString, "Data Source=:memory:;New=True;"},
    {NHibernate.Cfg.Environment.Isolation, "ReadCommitted"},
    {NHibernate.Cfg.Environment.CurrentSessionContextClass, "call"}
};

Configuration.AddProperties(properties);

Configuration.AddAssembly(typeof(NHibernateConfiguration).Assembly);


var export = new SchemaExport(Configuration);
export.Execute(true, true, false);

SessionFactory = Configuration.BuildSessionFactory();

SchemaExport.Execute()抛出一个异常,告诉我SQLite方言不能处理DbType.DateTimeOffset。

除此之外的自然方式是使用自定义约定,但我不能这样做,因为它是asp.net核心:/

所有映射都存储在hbm.xml文件中。 我无法修改nHibernate配置。 我必须坚持使用asp.net核心。

此外,只有一个类使用DateTimeOffset并且它相当消耗,但我无法找到导入除此之外的所有其他类的方法。

任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我已经成功了。不是优雅的方式,但仍然。

正如我之前提到的,由于DateTimeOffset属性,有一个类是有问题的。

一种选择是从模型中删除这个类。

我无法使用AddClass()方法添加所有类,但是因为没有保留命名约定。所以我想出了一个解决方法:

我已遍历所有类(除了有问题的类)并为每个类构建了“* .hbm.xml”文件名,然后我使用AddResource()方法将每个文件添加到配置中。

foreach (var type in assembly.GetTypes().Where(t => typeof(BaseModel).IsAssignableFrom(t) && t.Name != nameof(ProblematicType) && !t.IsAbstract))
{
    var mappingName = string.Join(".", type.Namespace.Replace("Model", "DataMapping"), type.Name) + ".hbm.xml";
    configuration.AddResource(mappingName, assembly);
}

它看起来像那样(我省略了项目特定的行)。

我知道这可能不是最好的方法,当然它不能解决根本问题,但它运行正常。