好的,这是合约。
我在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并且它相当消耗,但我无法找到导入除此之外的所有其他类的方法。
任何想法如何解决这个问题?
答案 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);
}
它看起来像那样(我省略了项目特定的行)。
我知道这可能不是最好的方法,当然它不能解决根本问题,但它运行正常。