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

如何使用NHibernate(或Fluent)检查表是否存在?,nhibernate,orm,fluent-nhibernate,database-metadata,Nhibernate,Orm,Fluent Nhibernate,Database Metadata,检查NHibernate(或Fluent NHibernate)中是否存在表的最佳、最一致的方法是什么 有可能吗?我的意思是,对于这样一个重型ORM来说,这似乎是一项简单的任务 还有一个相关的问题,您能否检查NHibernate是否存在一组表或整个模式?我查看了SchemaUpdate的源代码。我知道SchemaUpdate可以检测到丢失的表,然后生成创建脚本,而不是更新脚本。果然,答案就在那里 如果数据库中不存在表,则NHibernate.Tool.hbm2ddl.DatabaseMetada

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

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


还有一个相关的问题,您能否检查NHibernate是否存在一组表或整个模式?

我查看了SchemaUpdate的源代码。我知道SchemaUpdate可以检测到丢失的表,然后生成创建脚本,而不是更新脚本。果然,答案就在那里

如果数据库中不存在表,则
NHibernate.Tool.hbm2ddl.DatabaseMetadata
对象中的
GetTableMetadata
函数将返回null

通常,SchemaUpdate创建一个DatabaseMetadata对象,并传入一个
配置
对象。但看起来创建数据库元数据所需的只是一个DBConnection和方言对象

SchemaUpdate创建数据库元数据,因此:

connectionHelper.Prepare();
connection = connectionHelper.Connection;
meta = new DatabaseMetadata(connection, dialect);
NHibernate.Cfg.Configuration
然后调用

ITableMetadata tableInfo = databaseMetadata.GetTableMetadata(...);

如果您将NHibernate配置存储在某个位置,或者在构建会话工厂之前执行此操作,则可以根据数据库验证生成的架构

    public void ValidateSchema(Configuration config)
    {
        new SchemaValidator(config).Validate();
    }

当搜索这样一个解决方案时,这个问题和回答在谷歌随处可见,所以我想我应该以更精确和简洁的方式为自己解释一下(由于问题的年龄,很可能是一个补充);“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"))
        {
        ...