NHibernate、SQLite和ATTACH数据库

NHibernate、SQLite和ATTACH数据库,sqlite,nhibernate,Sqlite,Nhibernate,我正在尝试做一些稍微不寻常的事情。。。我目前有一个SQLite数据库,通过NHibernate访问。此数据库经常上载到服务器。我有一个新的需求,需要创建一个新的表用于报告目的,这将变得非常大。这个表不需要上传到服务器,所以我想把它放在一个单独的数据库中,并使用它从我的主数据库透明地访问它 问题是我不知道如何使用NHibernate。。。我如何告诉NHibernate连接其他数据库?我找不到任何允许这样做的连接字符串参数或NH配置属性。。。有可能吗 一个可接受的选项是在连接打开时手动执行ATTAC

我正在尝试做一些稍微不寻常的事情。。。我目前有一个SQLite数据库,通过NHibernate访问。此数据库经常上载到服务器。我有一个新的需求,需要创建一个新的表用于报告目的,这将变得非常大。这个表不需要上传到服务器,所以我想把它放在一个单独的数据库中,并使用它从我的主数据库透明地访问它

问题是我不知道如何使用NHibernate。。。我如何告诉NHibernate连接其他数据库?我找不到任何允许这样做的连接字符串参数或NH配置属性。。。有可能吗

一个可接受的选项是在连接打开时手动执行
ATTACH DATABASE
命令,但我不知道如何执行。当我构建NH会话工厂时,它会立即尝试更新模式(
hbm2ddl.auto=update
),在此之前我没有机会对连接做任何事情。因此,它将尝试在我的主数据库上创建新表,这当然不是我想要的

以前有人这样做过吗?你是怎么做到的

谢谢


编辑:如果有人需要做同样的事情,我的解决方案,灵感来自迭戈的答案

连接提供程序:

public class AttachedDbConnectionProvider : DriverConnectionProvider
{
    private string _attachedDbAlias;
    private string _attachedDbFileName;

    public override IDbConnection GetConnection()
    {
        var connection = base.GetConnection();
        if (!string.IsNullOrEmpty(_attachedDbAlias) && !string.IsNullOrEmpty(_attachedDbFileName))
        {
            using (var attachCommand = connection.CreateCommand())
            {
                attachCommand.CommandText = string.Format(
                    "ATTACH DATABASE '{0}' AS {1}",
                    _attachedDbFileName.Replace("'", "''"),
                    _attachedDbAlias);
                attachCommand.ExecuteNonQuery();
            }
        }
        return connection;
    }

    public override void Configure(IDictionary<string, string> settings)
    {
        base.Configure(settings);
        settings.TryGetValue("connection.attached_db_alias", out _attachedDbAlias);
        settings.TryGetValue("connection.attached_db_filename", out _attachedDbFileName);
    }
}
<property name="connection.provider">MyApp.DataAccess.AttachedDbConnectionProvider, MyApp.DataAccess</property>
<property name="connection.attached_db_alias">reportdb</property>
<property name="connection.attached_db_filename">mydatabase.report.db</property>
公共类AttachedDbConnectionProvider:DriverConnectionProvider
{
私有字符串_attachedbalias;
私有字符串_attachedbfilename;
公共覆盖IDbConnection GetConnection()
{
var connection=base.GetConnection();
如果(!string.IsNullOrEmpty(_attachedbalias)和&!string.IsNullOrEmpty(_attachedbfilename))
{
使用(var attachCommand=connection.CreateCommand())
{
attachCommand.CommandText=string.Format(
“将数据库{0}附加为{1}”,
_附件B文件名。替换(“,”),
_附件);
attachCommand.ExecuteOnQuery();
}
}
回路连接;
}
公共覆盖无效配置(IDictionary设置)
{
配置(设置);
settings.TryGetValue(“connection.attached\u db\u alias”,out\u attachedbalias);
settings.TryGetValue(“connection.attached\u db\u filename”,out\u attachedbfilename);
}
}
配置文件:

public class AttachedDbConnectionProvider : DriverConnectionProvider
{
    private string _attachedDbAlias;
    private string _attachedDbFileName;

    public override IDbConnection GetConnection()
    {
        var connection = base.GetConnection();
        if (!string.IsNullOrEmpty(_attachedDbAlias) && !string.IsNullOrEmpty(_attachedDbFileName))
        {
            using (var attachCommand = connection.CreateCommand())
            {
                attachCommand.CommandText = string.Format(
                    "ATTACH DATABASE '{0}' AS {1}",
                    _attachedDbFileName.Replace("'", "''"),
                    _attachedDbAlias);
                attachCommand.ExecuteNonQuery();
            }
        }
        return connection;
    }

    public override void Configure(IDictionary<string, string> settings)
    {
        base.Configure(settings);
        settings.TryGetValue("connection.attached_db_alias", out _attachedDbAlias);
        settings.TryGetValue("connection.attached_db_filename", out _attachedDbFileName);
    }
}
<property name="connection.provider">MyApp.DataAccess.AttachedDbConnectionProvider, MyApp.DataAccess</property>
<property name="connection.attached_db_alias">reportdb</property>
<property name="connection.attached_db_filename">mydatabase.report.db</property>
MyApp.DataAccess.AttachedDbConnectionProvider,MyApp.DataAccess
报告数据库
mydatabase.report.db
现在,要将一个类映射到附加数据库中的一个表,我只需要在映射文件中指定“reportdb”

public class MyConnectionProvider : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        var connection = base.GetConnection();
        var attachCommand = connection.CreateCommand();
        attachCommand.CommandText = "ATTACH DATABASE FOO";
        attachCommand.ExecuteNonQuery();
        return connection;
    }
}
配置:

<property name="connection.provider">MyConnectionProvider, MyAssembly</property>
MyConnectionProvider,MyAssembly
这可能会有帮助

public class MyConnectionProvider : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        var connection = base.GetConnection();
        var attachCommand = connection.CreateCommand();
        attachCommand.CommandText = "ATTACH DATABASE FOO";
        attachCommand.ExecuteNonQuery();
        return connection;
    }
}
配置:

<property name="connection.provider">MyConnectionProvider, MyAssembly</property>
MyConnectionProvider,MyAssembly

好主意,谢谢!有没有办法将参数传递给连接提供程序?这就是我最终发现的。。。再次感谢,它就像一个符咒!好主意,谢谢!有没有办法将参数传递给连接提供程序?这就是我最终发现的。。。再次感谢,它就像一个符咒!