Дозвуковой: динамические связи - PullRequest
2 голосов
/ 09 июня 2009

У меня древний беспорядок, который я пытаюсь засыпать в ярусы с помощью дозвуковых. Беда в том, что у меня такой сценарий:

Когда Хэл входит в систему, его логин использует базу данных X для поиска данных, базу данных Y для своих учетных записей и базу данных Z для своих контактов.

Когда Барри входит в систему, он использует базу данных X для поиска данных, базу данных Q для своих учетных записей и базу данных R для своих контактов.

X, Y, Z, Q и R находятся на одном сервере. У Y есть идентичная схема для Q, и у Z есть схема, идентичная R. У меня не получается, насколько это глупо:)

Мне нужно, чтобы приложение .NET Winforms (используя дозвуковую систему) указывало на правильные базы данных.

Насколько я могу судить, мне придется испачкать руки, изменяя источник SubSonic (и поддерживать эти изменения с каждым дозвуковым выпуском), чтобы он мог принимать параметры вместо использования app.config. Кто-нибудь может увидеть альтернативу этому?

Ответы [ 5 ]

2 голосов
/ 10 июня 2009

Я никогда не считал SharedDbConnectionScope простым и подходящим для моих приложений

И все же это ответ, не так ли? Вот почему мы поместили его туда - и да, я слышал ваши запросы на изменение соединения на лету, и я его встроил, и я продолжаю рассказывать вам о каждой имеющейся у нас теме.

Изменение соединений на лету - это запрос, который у нас был долгое время, и мы добавили его туда давным-давно, и, насколько я знаю, он работает как шарм.

Для SubSonic 3 я подключаю около 10 различных способов, которыми вы можете изменить соединение с БД в любое время, на любую платформу, какую хотите, с любым набором объектов, который вы хотите.

1 голос
/ 16 сентября 2010

Еще один пример смены провайдеров на лету (во время выполнения). Он читает элементы из одной базы данных и сохраняет их в другой.

Использование:

CopyToAnotherDB<Dock>(Dock.Columns.Id, Dock.BarcodeStringColumn);

Метод:

    public static void CopyToAnotherDB<E>(string identifierColumnName, TableSchema.TableColumn fakeDirtyColHack)
        where E : ActiveRecord<E>, new()
    {
        SqlQuery q = new Select().From<E>();
        q.ProviderName = SERVU_PROVIDER;
        IList<E> list = q.ExecuteTypedList<E>();

        string connStr = ConfigurationManager.ConnectionStrings[ARCHIVE_PROVIDER].ConnectionString;
        using (SharedDbConnectionScope scope = new SharedDbConnectionScope(connStr))
        {
            foreach (E item in list)
            {
                int itemID = (int)item.GetColumnValue(identifierColumnName);
                SqlQuery qry = new Select(identifierColumnName).From<E>().Where(identifierColumnName).IsEqualTo(itemID);
                int recCount = qry.GetRecordCount();
                E obj = item.Clone();

                obj.IsNew = recCount == 0; //determines if adding or updating
                obj.IsLoaded = !obj.IsNew; //determines if adding or updating
                obj.DirtyColumns.Add(fakeDirtyColHack);
                obj.Save();
            }
        }
    }
1 голос
/ 10 июня 2009

Спасибо, ребята. Я уже работал с несколькими провайдерами, но не знал, как их установить во время выполнения (и я уже искал этот форум. Должно быть, я использовал неправильные ключевые слова).

SharedDBConnectionScope кажется идеальным для работы на лету, но, похоже, не предназначен для установки провайдера на весь пользовательский сеанс.

Так что я сделал больше поиска, основываясь на ваших ответах выше, и нашел следующее решение:

1) Добавьте три провайдера для поиска, учетных записей и контактов и создайте DAL.

2) добавить это в DAL:

public static void SetProvider(string strProvider,string strConnectionString)
{
    DataService.GetInstance(strProvider).DefaultConnectionString = 
                                                     strConnectionString;
}

3) вызвать его при входе в систему, как только мое приложение определит, какие базы данных использует пользователь, например,

MyDAL.SSProvider.SetProvider("Lookups", 
            "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=X")

MyDAL.SSProvider.SetProvider("Accounts", 
      "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Y")

MyDAL.SSProvider.SetProvider("Contacts",    
               "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Z")

И пошло-поехало.

1 голос
/ 09 июня 2009
  1. Subsonic может создать dal для нескольких баз данных. Просто добавьте провайдера, ссылающегося на другую строку подключения, в ваш app.config. Измените пространство имен для каждого поставщика.

Теперь вы должны иметь доступ к: My.Namespace.R ... My.Namespace.X ...

  1. Вы можете легко изменить соединение на лету:

    using (SharedDbConnectionScope scope = new SharedDbConnectionScope("new connectionstring "))
    {
    }
    

Если вам не нужно более одного соединения одновременно, это тоже возможно. Мы используем это для выхода из системы и входа на другой сервер (Еще один побочный эффект заключается в том, что вам не требуется приложение / web.config.

Нашел этот пример здесь: http://www.digvijay.eu/post/2008/10/30/SubSonic-Trick-Specify-connection-string-at-runtime!.aspx

Каждый раз, когда вы вызываете InitSubsonic, соединение меняется.

public class MySubsonicProvider
{

    private static bool _bIsInitialized = false;

    public static void InitSubsonic(string server, string schema, string user, string password)
    {

        DataService.Providers = new DataProviderCollection();

        // here you can get settings from anywhere and make up a connection string :)
        MyDataProvider provider = new MyDataProvider("Server={0};Database={1};Uid={2};Password={3}", server, schema, user, password);
        DataService.Providers.Add(provider);
        DataService.Provider = provider;

        _bIsInitialized = true;

        // Clear cached values
        ClearSubSonicCache();

    }

    public class MyDataProvider : MySqlInnoDBDataProvider
    {

        private string _server;
        private string _schema;
        private string _user;
        private string _password;

        public string Server { get { return _server; } }
        public string Schema { get { return _schema; } }
        public string User { get { return _user; } }
        public string Password { get { return _password; } }

        public MyDataProvider(string connectionString, string server, string schema, string user, string password)
        {
            DefaultConnectionString = String.Format(connectionString, server, schema, user, password);

            _server = server;
            _schema = schema;
            _user = user;
            _password = password;

        }

        public override string Name
        {
            get { return "MyDataProvider"; }
        }

    }
}
1 голос
/ 09 июня 2009

Вам не нужно изменять источник, вы просто должны иметь возможность использовать несколько провайдеров для общения с различными базами данных и переключения между ними во время выполнения. Посмотрите на следующий вопрос, чтобы узнать, как это сделать:

Отдельное соединение для чтения / записи для SubSonic

...