Сначала в коде EF4.1, как переопределить имя ConnectionString в Web.config - PullRequest
5 голосов
/ 23 марта 2011

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

Для разработки я рад использовать 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 и предоставляя строку подключения (используя строку conn 'placeholder' в Web.config и заменяя "{clientId} "с уникальным идентификатором), и я также попытался установить строку подключения в конструкторе MyModels:

base.Database.Connection.ConnectionString = xxx;

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 25 марта 2011

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

1 голос
/ 25 марта 2011

Я не уверен, что это возможный подход для решения вашей проблемы.Моя идея состоит в том, чтобы создать статический "фабричный" класс для создания экземпляра вашего класса 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, а не кодом вначале.

...