Платформа Entity 4.1 изменяет строку подключения для каждой среды модульного тестирования разработчиков - PullRequest
2 голосов
/ 31 января 2012

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

Автоматически сгенерированный производный класс 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.

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

Ответы [ 2 ]

3 голосов
/ 31 января 2012

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

2 голосов
/ 06 февраля 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...