Сначала в коде EF4.1, как переопределить имя ConnectionString в Web.config

Я создаю мультитенантное веб-приложение Asp.Net MVC 3 и сначала использую код EF4.1 для модели базы данных.

Для разработки я рад использовать SqlServerCE в App_Data, а для производства это перейдет на Sql Server 2008.

Скажем, мой контекст называется «MyModels», по умолчанию код сначала ищет строку подключения с именем «MyModels» в Web.config. Этому можно указать использовать файл в App_Data или изменить для доступа к базе данных в SQL2008. Пока все в порядке.

Но из-за мультиарендности я хотел бы, чтобы имя файла SqlServerCE соответствовало уникальному идентификатору арендатора (поэтому App_Data будет иметь «client_x.sdf», «client_y.sdf»; Sql Server 2008 будет иметь отдельные базы данных). Я не могу понять, как обращаться к этим разным базам данных.

Я пробовал MyModels, наследующий от DbContext и предоставляющий строку подключения (используя строку подключения «заполнитель» в Web.config и заменяя «{clientId}» уникальным идентификатором), и я также пытался установить строку подключения в Конструктор MyModels:

base.Database.Connection.ConnectionString = xxx;

но это никогда не работает. Я всегда получаю следующую ошибку:

При установлении соединения с SQL Server произошла ошибка, связанная с сетью или конкретным экземпляром. Сервер не найден или не был доступен. Убедитесь, что имя экземпляра указано правильно и что SQL Server настроен на разрешение удаленных подключений. (поставщик: поставщик именованных каналов, ошибка: 40 — не удалось открыть соединение с SQL Server)

(Это говорит о том, что он еще не «настроен» для использования SqlServerCE, и поэтому пытается подключиться к Sql Server. Я думаю!)

Отслеживая код, Database.Connection.ConnectionString на данный момент не был прочитан из Web.config, поэтому я не могу найти и заменить его, и, возможно, позже в конвейере он будет перезаписан строкой соединения «заполнитель». .

Я считаю, что это должно быть довольно просто, и я просто не могу найти «крючок». Кто-нибудь может помочь?


person Steve Owen    schedule 23.03.2011    source источник
comment
Я понял это, и это потому, что я немного тупой. Прости! Я просто пытался установить ConnectionString как connectionString из Web.config, но на самом деле мне нужно построить его с помощью DbConnectionStringBuilder. Если я заменю свойство ConnectionString построителя, а затем использую построитель для установки строки подключения EF, это сработает. Я мог бы пометить это как решенное, пожалуйста!   -  person Steve Owen    schedule 23.03.2011
comment
Напишите содержание вашего комментария в качестве ответа и примите его.   -  person Ladislav Mrnka    schedule 23.03.2011
comment
Как утверждает Ладислав Мрнка, совершенно нормально отвечать на свой вопрос. Я считаю, что вам нужно подождать день или около того, прежде чем вы сможете отметить свой ответ как ответ, но это разрешено;)   -  person Zhaph - Ben Duguid    schedule 24.03.2011


Ответы (2)


Я не уверен, что это возможный подход к решению вашей проблемы. Моя идея состоит в том, чтобы создать статический «фабричный» класс для создания экземпляра вашего класса DbContext. Код такой:

public static class MyModelsFactory
{
    public static MyModels CreateMyModels()
    {
        string connectionString = string.Empty;
        // some code to retrieve your connectionString.
        return new MyModels(connectionString);
    }
}

И вы можете вызвать метод CreateMyModels везде, где вам нужно создать экземпляр класса MyModels:

using (MyModels models = MyModelsFactory.CreateMyModels())
{
    //your code
}

Это работает для меня в случае, если мне нужно изменить строку подключения в соответствии с некоторой логикой во время выполнения. Но мой класс DbContext генерируется автоматически классическим EF, а не кодом.

person Ricky    schedule 25.03.2011

Я понял это, и это потому, что я немного тупой. Прости! Я просто пытался установить ConnectionString как connectionString из Web.config, но на самом деле мне нужно построить его с помощью DbConnectionStringBuilder. Если я заменю свойство ConnectionString построителя, а затем использую построитель для установки строки подключения EF, это сработает.

person Steve Owen    schedule 25.03.2011
comment
Я получаю те же ошибки. Небольшой код, показывающий, из какой части состоит строка web.config и как ее установить в противном случае, был бы мне ОЧЕНЬ полезен. - person jp2code; 24.05.2011