你如何检查是否有表与NHibernate(或流利)存在?
-
21-09-2019 - |
题
最新最好的,最一致的方法来检查一个表中NHibernate的(或具有流利-NHibernate的)是否存在?
它甚至有可能?我的意思是它似乎像这样的重型ORM一个简单的任务。
另外一个相关的问题,你能不能检查,如果一组表或整个架构与NHibernate存在?
解决方案
如果您保存您的NHibernate配置的地方或做你建立你的会话工厂之前,可以验证对数据库生成的模式。
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
其他提示
我看着在SchemaUpdate工具的源代码。我知道SchemaUpdate工具可以检测到缺少表,然后生成一个脚本创建,而不是更新脚本。果然,答案是没有。
在GetTableMetadata
对象的NHibernate.Tool.hbm2ddl.DatabaseMetadata
函数将返回空值如果表中不数据库存在。
通常,SchemaUpdate工具创建一个DatabaseMetaData对象并将在成Configuration
对象。但它看起来像所有你需要创建一个DatabaseMetaData的是DBConnection的和方言对象。
SchemaUpdate工具创建一个DatabaseMetaData正是如此:
connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
然后NHibernate.Cfg.Configuration
调用
ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);
这个问题和应对谷歌这样的解决搜索时弹出无处不在,所以我想我会放什么工作[由于年龄的问题,很可能是另外在一个更为精确和简洁的方式为我; “的 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"))
{
...
希望帮助某人因为我绊在此之前执行类似于上述旋绕策略;)
不隶属于 StackOverflow