我正在尝试做一些不寻常的事情......我目前有一个SQLite数据库,可以通过NHibernate访问。该数据库经常上传到服务器。我有一个新的要求是为报告目的创建一个新表,预计会变得非常大。这个表不需要上传到服务器,所以我想将它放在一个单独的数据库中,并使用ATTACH DATABASE从我的主数据库透明地访问它。
问题是我不知道如何使用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>
现在,要将类映射到附加数据库中的表,我只需要指定“reportdb”。在映射文件中
答案 0 :(得分:1)
这可能会有所帮助......
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>