我正在使用带有FluentNHibernate的NHibernate作为我的DAL。我还使用SchemaExport
和SchemaUpdate
来创建和更新我的数据库架构。
我的问题是架构操作都需要数据库存在才能工作。我想以编程方式创建我的数据库并更新架构,因为可能有多个数据库,并且数据库的创建不仅是一次性操作。
我知道我可以通过在与master数据库的连接上执行create database命令来手动执行此操作,但考虑到我否则使用NHibernate进行所有数据库交互,这感觉不对。顺便说一句,我使用SQLite内存数据库进行单元测试,因此我编写的任何sql都必须知道我正在使用哪个数据库。
有没有办法让NHibernate为我创建数据库?
答案 0 :(得分:12)
如果您开始使用域模型开发应用程序,我认为使用NHibernate创建数据库很不错。我的意思是 - 它可以让您深入了解数据库的外观。但一般来说 - 应该使用sql脚本。
我听说有些开发人员使用NHibernate数据库生成进行集成测试,他们在飞行中创建轻量级的sqlite数据库。
如何使用NHibernate生成数据库?这就是我这样做的方式:
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<NHibernateBootstrapper>())
.ExposeConfiguration(BuildSchema);
ObjectFactory.Inject(cfg.BuildSessionFactory());
}
private static void BuildSchema(Configuration config)
{
//Creates database structure
//new SchemaExport(config)
// .Create(false, true);
}
答案 1 :(得分:9)
不,NHibernate不会为您创建数据库。创建数据库是您通常不希望在运行中完成的事情。它需要许多配置参数,这是特定于数据库的,甚至是特定于数据库版本的。
对于我们的产品,我写了一个设置数据库的类。它用于安装程序,集成测试和数据库维护工具。
还有一种特殊情况,即客户不希望授予创建数据库的权利。然后我们希望他这样做并跳过这部分。
答案 2 :(得分:5)
我们使用SchemaExport提供架构和Nant任务来删除和重新创建数据库。另一个Nant任务运行模式导出和数据加载代码,该代码以nunit任务运行的集成测试的形式存在。有sample here。
答案 3 :(得分:1)
嗯,你确实可以使用SchemaExport,但我认为NHibernate主要是为了弥合OO域模型和关系持久性存储之间的差距。 也就是说,对我来说,NHibernate的目的是在我的域模型中持久化和检索实体。
如果你想进行架构更新,imho,你不应该使用NHibernate(如果可能的话),因为那不是NHibernate的目的;有一种称为SQL的“域特定语言”,它擅长做这些事情。
为了创建我的数据库并更新我的数据库模式,我使用Migrator.NET,这是一个框架,它允许您在指定需要完成的内容中编写C#类(创建表,添加一栏等......) 这样做的好处是,Migrator.NET也支持多个DBMS,因此您最终不会编写特定于DB的SQL代码。
答案 4 :(得分:1)
看看RhinoCommons。在Rhino.Commons.ForTesting下,在UnitOfWorkTestContextDbStrategy.cs中,Ayende在那里创建了一些创建数据库的例程。
答案 5 :(得分:0)
我自己正在寻找这个,就像我在java中看到的那样 - 这里有类似的问题:Generate Database from NHibernate config files