检查NHibernate(或Fluent-NHibernate)中是否存在表格的最佳,最一致的方法是什么?
甚至可能吗?我的意思是,对于如此重型的ORM而言,这似乎是一项简单的任务。
同样在相关问题上,您可以检查NHibernate是否存在一组表格或整个模式吗?
答案 0 :(得分:12)
如果您在某处存储NHibernate配置或在构建会话工厂之前执行此操作,则可以针对数据库验证生成的架构。
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
答案 1 :(得分:3)
我查看了SchemaUpdate的源代码。我知道SchemaUpdate可以检测到丢失的表,然后生成创建脚本,而不是更新脚本。果然,答案就在那里。
如果数据库中不存在表,GetTableMetadata
对象中的NHibernate.Tool.hbm2ddl.DatabaseMetadata
函数将返回null。
通常,SchemaUpdate会创建一个DatabaseMetadata对象并传入Configuration
对象。但看起来创建DatabaseMetadata所需的只是DBConnection和Dialect对象。
SchemaUpdate因此创建了一个DatabaseMetadata:
connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
NHibernate.Cfg.Configuration
然后调用
ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);
答案 2 :(得分:2)
在搜索这样的解决方案时,谷歌到处都出现了这个问题和响应,所以我想我会以更精确和简洁的方式为我做出因[问题年龄,很可能是一个补充]而有效的问题; "的 IsTable 强>":
var configuration = Fluently.Configure()
.Database(MsSqlConfiguration
.MsSql2008
...
.BuildConfiguration();
var session = configuration.BuildSessionFactory().OpenSession();
DatabaseMetadata meta = new DatabaseMetadata((DbConnection)session.Connection, new NHibernate.Dialect.MsSql2008Dialect());
//TABLE_NAME e.g. "hibernate_unique_key"
if (meta.IsTable("TABLE_NAME"))
{
...
希望能帮助某人,因为我在遇到这个问题之前实施了类似于上述的复杂策略;)