Entity framework 4.1 изменяет строку подключения для каждой среды модульного тестирования разработчиков

У нас есть настройка Entity framework 4.1, автоматически сгенерированные POCO и классы DbContext для взаимодействия с db.

Автоматически созданный производный класс DbContext выглядит следующим образом:

 public MyEntities()
        : base("name=MyEntities")
    {
    }

И автоматически сгенерированная строка подключения в app.config примерно такая:

<connectionStrings>
    <add name="MyEntities" connectionString="blah blah blah"  providerName="System.Data.EntityClient" />
</connectionStrings>

Это все прекрасно, и работает прямо из коробки.

У каждого из наших разработчиков установлена ​​собственная версия SQL Developer для модульного тестирования и разработки, поэтому им необходимо изменить строку подключения, чтобы она указывала на их установку при модульном тестировании. Эти строки подключения находятся в файле App.config проекта модульного тестирования.

В настоящее время это шаг модификации вручную, и я думал каким-то образом автоматизировать его.

Теперь я могу пойти и обработать строку подключения в коде, но передать ее в конструктор инфраструктуры сущностей мешает автоматически сгенерированный по умолчанию конструктор "MyEntities" выше - у него нет параметра строки подключения ни в одном конструкторе. (Хотя DbContext делает). Кроме того, я не особенно хочу прокладывать строку подключения через код DAL и опускаться в код структуры сущностей - это не нужно в производстве, поэтому я модифицирую свой код только для целей модульного теста.

Я думал, что должен быть какой-то способ переопределить строку в App.config. Это похоже на то, как это можно сделать с локальным файлом Appsettings. (ie <appSettings file="Local.config"/>), но я не понимаю, как это сделать для записей ConfigurationManager.ConnectionStrings.

Итак, что здесь делать?


person Coopernick    schedule 31.01.2012    source источник
comment
Если у каждого разработчика есть свой SQL-сервер, вам не нужно менять строку подключения. Просто договоритесь, что все должны использовать экземпляр по умолчанию и что база данных имеет фиксированное имя.   -  person Ladislav Mrnka    schedule 31.01.2012
comment
Извините, но иногда у нас на одной машине установлены разные SQL, люди работают над множеством разных вещей, мы не можем гарантировать, что все должны это делать.   -  person Coopernick    schedule 06.02.2012
comment
Я работал над разными вещами разного размера и сложности несколько лет, и мне никогда не требовалось более одного экземпляра SQL-сервера (за исключением одной ситуации, когда мне специально нужно было протестировать миграцию между двумя экземплярами). Если мне нужно было работать изолированно, я использовал виртуальную машину. Так что это не выглядит веским аргументом.   -  person Ladislav Mrnka    schedule 06.02.2012


Ответы (2)


Если соглашение об именах неприемлемо, вы можете создать псевдоним SQL на каждом компьютере разработчика, чтобы указать на их собственный экземпляр SQL. Эта статья: http://www.mssqltips.com/sqlservertip/1620/how-to-setup-and-use-a-sql-server-alias/ содержит пошаговые инструкции по созданию псевдонима.

person Fabrice Michellonet    schedule 31.01.2012
comment
Знаешь что? Это, возможно, было лучше. Спасибо! - person Coopernick; 06.02.2012

Спасибо, вот что я в итоге сделал, вдохновленный:

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

Я бы никогда не посоветовал это для производства, вы должны использовать соответствующие преобразования и т. д.

Итак, для модульного теста у меня есть "источник данных = ENVVARTOSQLSERVER", определенный в app.configs.

Затем нажмите fn в модульном тесте, чтобы изменить конфигурацию, сохранить ее и перезагрузить при запуске.

    private static void ModifyUnitTestConnectionString()
    {
        // Note that the updated .NET 2.0 and later "ConfigurationManager.ConnectionStrings"
        // cannot be used to modify or add connection strings, as it is read only.
        // However, accessing the same settings via the configurationSection directly
        // is not read only.

        // Get current configuration.
        Configuration currentconfiguration = 
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

        // Get the connection strings section
        ConnectionStringsSection currentConnectionStringsSection = 
            currentconfiguration.ConnectionStrings;

        // Read the "SiteEntities" connection string.
        string ntCNStr = 
            ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString;

        // Replace any instances of "ENVVARTOSQLSERVER" in that connection string
        // with the appropriate environment variable.
        EntCNStr = EntCNStr.Replace("ENVVARTOSQLSERVER",
                                            Environment.GetEnvironmentVariable("ENVVARTOSQLSERVER"));

        // Write the connection string and save the changed config file.
        currentconfiguration.ConnectionStrings
                            .ConnectionStrings["MyEntities"].ConnectionString = siteEntCNStr;
        currentconfiguration.Save(ConfigurationSaveMode.Minimal);

        // This is this needed to refresh the configuration manager and get it to
        // read the config file again.
        ConfigurationManager.RefreshSection("connectionStrings");
    }

Ну это все. Разработчикам необходимо установить переменную среды, чтобы был указан соответствующий исходный путь к их SQL.

person Coopernick    schedule 06.02.2012