2011-05-04 48 views
32

我有一个应用程序,我使用Fluent Nhibernate来创建我的数据库。到目前为止,我一直在重新创建数据库模式。代码是这样的:Fluent NHibernate - 只在不存在的情况下创建数据库架构

public NhibernateSessionFactory(IPersistenceConfigurer config) 
{ 
    _sessionFactory = Fluently.Configure(). 
     Database(config). 
     Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()). 
     ExposeConfiguration(BuildSchema). 
     BuildSessionFactory(); 
} 

private static void BuildSchema(Configuration config) 
{ 
    // if (DbExists(config)) 
    // return; 

    new SchemaExport(config).Create(false, true); 
} 

请注意“if (DbExists(config))”。这是我想要做的。我只想创建模式,只要它实际上不存在。在下一步中 - 如果它不是最新的,我想更新 。

我该如何做到这一点?我期待config.DatabaseExists(),但我看不到这样的事情。我发现了一些解决方案的可能性,但处理这个问题的典型推荐方法是什么?

回答

67

您可以只使用SchemaUpdate相反,如果存在的话,它会更新架构,如果它不创建它:

public NhibernateSessionFactory(IPersistenceConfigurer config) 
{ 
    _sessionFactory = Fluently.Configure(). 
     Database(config). 
     Mappings(m => m.FluentMappings.AddFromAssemblyOf<MappingsPersistenceModel>()). 
     ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true)). 
     BuildSessionFactory(); 
} 

警告:SchemaUpdate不做破坏性的更新(删除表格,列等)。它只会添加它们。

+0

太棒了!这正是我所期待的。谢谢! – stiank81 2011-05-05 06:51:27

+0

完美!谢谢 – Bronek 2014-06-12 18:54:44

9

修订(感谢dotjoe)

就是hbm2ddl只能够做一个架构差异,只更新什么用SchemaUpdate工具类改变。然而这个类是非常基本的,因为它只考察当前的实体以及模式的不同。如果发生了重大变化(即删除了实体或删除了链接表),它将无法弄清楚。

在早期的项目中,我们使用了hbm2ddl,但是后来我们开始使用Fluent Migrator。我会说你最好的选择是使用迁移工具,如Fluent Migrator或Migrator.NET。

http://github.com/schambers/fluentmigrator/

http://code.google.com/p/migratordotnet/

+0

实际上就是hbm2ddl会产生改变与'SchemaUpdate'脚本......但是,它并没有赶上一切,我从来没有依靠它。 – dotjoe 2011-05-04 14:42:14

+0

@dotjoe你只是指它不会破坏性更新的事实吗?我在生产中使用了SchemaUpdate,从来没有遇到过任何问题。 – 2011-05-04 14:53:10

+0

@Gabe Moothart它不会赶上柱状空能力的变化,但我想,如果从空列移动到非空列将被视为破坏性的变化。 – dotjoe 2011-05-04 16:03:07

相关问题