Първо в кода EF4.1, как да замените името на ConnectionString в Web.config

Създавам мултитенантно 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 „заместител“ по-късно в конвейера .

Смятам, че това трябва да е доста лесно и просто не мога да намеря „куката“. Може ли някой да помогне?


person Steve Owen    schedule 23.03.2011    source източник
comment
Разбрах го и е защото съм малко тъп. Съжалявам! Просто се опитвах да настроя ConnectionString да бъде connectionString от Web.config, но всъщност трябва да го създам с помощта на DbConnectionStringBuilder. Ако заменя свойството ConnectionString на конструктора, след това използвам конструктора, за да задам низа EF conn, работи. Мога да отбележа това като решено, моля!   -  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 conn, работи.

person Steve Owen    schedule 25.03.2011
comment
Получавам същите грешки. Малко код, показващ каква част прави низа web.config и как да го настроя в противен случай, би ми бил МНОГО полезен. - person jp2code; 24.05.2011