Базы данных NHibernate, SQLite и ATTACH - PullRequest
1 голос
/ 29 декабря 2010

Я пытаюсь сделать что-то немного необычное ... В настоящее время у меня есть база данных 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».в файле сопоставления

1 Ответ

1 голос
/ 29 декабря 2010

Это может помочь ...

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...