我使用NHibernate和FluentNHibernate作为我的DAL.我也在使用SchemaExport
和SchemaUpdate
创建和更新我的数据库模式.
我的问题是模式操作都需要数据库存在才能工作.我想以编程方式创建我的数据库并更新模式,因为可能有多个数据库,并且创建数据库不仅是一次性操作.
我知道我可以通过在与master数据库的连接上执行create database命令来手动执行此操作,但考虑到我否则使用NHibernate进行所有数据库交互,这感觉不对.顺便说一句,我使用SQLite内存数据库进行单元测试,因此我编写的任何sql都必须知道我正在使用哪个数据库.
有没有办法让NHibernate为我创建我的数据库?
我认为如果你开始用域模型开发应用程序,用NHibernate创建数据库是很好的.我的意思是 - 它可以让您深入了解数据库的外观.但一般来说 - 应该使用sql脚本.
我听说有些开发人员使用NHibernate数据库生成进行集成测试,他们在飞行中创建轻量级的sqlite数据库.
如何用NHibernate生成db?这就是我这样做的方式:
public static void InitSessionFactory() { var connectionString = ConfigurationManager .ConnectionStrings["MyConnectionString"] .ConnectionString; var cfgFromXml = new Configuration(); cfgFromXml.Configure(); var cfg = Fluently.Configure(cfgFromXml) .Database(MsSqlConfiguration.MsSql2005 .ConnectionString(x => x.Is(connectionString)) .UseReflectionOptimizer()) .Mappings(x => x.FluentMappings .AddFromAssemblyOf()) .ExposeConfiguration(BuildSchema); ObjectFactory.Inject(cfg.BuildSessionFactory()); } private static void BuildSchema(Configuration config) { //Creates database structure //new SchemaExport(config) // .Create(false, true); }
不,NHibernate不会为您创建数据库.创建数据库是您通常不希望在运行中完成的事情.它需要许多配置参数,这是特定于数据库的,甚至是特定于数据库版本的.
对于我们的产品,我写了一个设置数据库的类.它用于安装程序,集成测试和数据库维护工具.
NHibernate使用其配置创建连接.
我自己的实现创建了数据库.不同的方言有不同的实现方式.
NH创建表和其他数据库对象
安装程序类创建初始数据
还有一种特殊情况,即客户不希望授予创建数据库的权利.然后我们希望他这样做并跳过这一部分.
我们使用SchemaExport提供模式和Nant任务来删除和重新创建数据库.另一个Nant任务运行模式导出和数据加载代码,该代码以nunit任务运行的集成测试的形式存在.这里有一个样本.