如何检查NHibernate(或Fluent)是否存在表?

时间:2009-10-12 21:22:54

标签: nhibernate orm fluent-nhibernate database-metadata

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

甚至可能吗?我的意思是,对于如此重型的ORM而言,这似乎是一项简单的任务。

同样在相关问题上,您可以检查NHibernate是否存在一组表格或整个模式吗?

3 个答案:

答案 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"))
        {
        ...

希望能帮助某人,因为我在遇到这个问题之前实施了类似于上述的复杂策略;)