5

检查 NHibernate(或 Fluent-NHibernate)中是否存在表的最佳、最一致的方法是什么?

甚至可能吗?我的意思是,对于这样一个重型 ORM 来说,这似乎是一项简单的任务。

同样在一个相关问题上,您能否检查 NHibernate 是否存在一组表或整个架构?

4

3 回答 3

12

如果您将 NHibernate 配置存储在某处或在构建会话工厂之前执行此操作,则可以针对数据库验证生成的模式。

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }
于 2009-10-14T19:10:13.037 回答
3

我查看了 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(...);
于 2009-10-13T01:50:07.367 回答
3

在搜索这样的解决方案时,谷歌到处都会出现这个问题和回复,所以我想我会以更精确和简洁的方式为我提供[由于问题年龄,很可能是一个补充]。“ 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"))
        {
        ...

希望对某人有所帮助,因为我在偶然发现之前实施了类似于上述的复杂策略;)

于 2015-07-29T03:56:02.937 回答