检查 NHibernate(或 Fluent-NHibernate)中是否存在表的最佳、最一致的方法是什么?
甚至可能吗?我的意思是,对于这样一个重型 ORM 来说,这似乎是一项简单的任务。
同样在一个相关问题上,您能否检查 NHibernate 是否存在一组表或整个架构?
检查 NHibernate(或 Fluent-NHibernate)中是否存在表的最佳、最一致的方法是什么?
甚至可能吗?我的意思是,对于这样一个重型 ORM 来说,这似乎是一项简单的任务。
同样在一个相关问题上,您能否检查 NHibernate 是否存在一组表或整个架构?
如果您将 NHibernate 配置存储在某处或在构建会话工厂之前执行此操作,则可以针对数据库验证生成的模式。
public void ValidateSchema(Configuration config)
{
new SchemaValidator(config).Validate();
}
我查看了 SchemaUpdate 的源代码。我知道 SchemaUpdate 可以检测到丢失的表,然后生成创建脚本,而不是更新脚本。果然,答案就在里面。
如果数据库中不存在表,则 object中的GetTableMetadata
函数将返回 null。NHibernate.Tool.hbm2ddl.DatabaseMetadata
通常,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(...);
在搜索这样的解决方案时,谷歌到处都会出现这个问题和回复,所以我想我会以更精确和简洁的方式为我提供[由于问题年龄,很可能是一个补充]。“ 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"))
{
...
希望对某人有所帮助,因为我在偶然发现之前实施了类似于上述的复杂策略;)