Как передать строку подключения в конструктор DBContext, ориентированного на базу данных, с Entity Framework 4.1? - PullRequest
4 голосов
/ 29 сентября 2011

По разным причинам я бы хотел , а не сохранить строку подключения для моей модели Entity Framework DB в одном из различных файлов .config. (Я использую самый последний и самый лучший API DBContext с новой версией Entity Framework 4.1, .NET 4 и Visual Studio 2010 C #.) Однако шаблон генерации кода для DBContext создает только один конструктор без параметров. (Если я не использую API-интерфейс DBContext, то в моей модели структуры сущностей можно выбрать 7 различных конструкторов, включая тот, который я хочу.)

Единственный способ понять, как это сделать - это напрямую изменить шаблон генерации кода (файл context.tt), чтобы получить нужный мне конструктор (пример кода ниже). Это работает, но мне кажется, что я делаю это "трудным путем". Как правильно получить конструктор DBContext, который принимает строку подключения?

    public <#=Code.Escape(container)#>(string connectionString)
        : base(connectionString)
    {
<#
        WriteLazyLoadingEnabled(container);
#>
    }

Последнее замечание на случай, если это поможет кому-то другому. Хотя этот метод работает, мне потребовалось некоторое время, чтобы понять, что «строка соединения» - это не строго строка соединения с БД, а скорее строка соединения специальной структуры сущностей, которая содержит строку соединения с БД (точно так же, как то, что будет храниться в приложении). .config file).

1 Ответ

3 голосов
/ 29 сентября 2011

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

Другой возможностью было бы сделать класс контекста db partial (еслиэто не по умолчанию) и создайте еще один частичный файл класса рядом с ним, чтобы добавить нужный конструктор.Но, вероятно, вы захотите, чтобы все ваших t4-сгенерированных контекстов следовали этому шаблону, поэтому я думаю, что лучше всего использовать генерацию кода, чтобы сделать это автоматически, как вы делаете в вопросе.

...