Я пытаюсь написать тест с использованием базы данных, размещенной в Azure SQL, с каркасом Effort на Entity Framework 6.
При выполнении следующего кода генерируется исключение:
[ClassInitialize]
public static void ClassInitialize(TestContext context)
{
EffortProviderConfiguration.RegisterProvider();
}
[TestMethod]
public void TestMethod1()
{
const string connectionString = "Data Source=***;Initial Catalog=my_catalog;User ID=user;Password=password;provider=System.Data.SqlClient";
IDataLoader loader = new EntityDataLoader(connectionString);
using (var ctx = new UsersDbContext(Effort.DbConnectionFactory.CreatePersistent("cool", loader)))
{
var usersCount = ctx.Users.Count();
}
}
Исключение, вызванное выполнением Count()
:
Effort.Exceptions.EffortException: Необработанное исключение при попытке инициализировать содержимое таблицы «Таблица» ---> System.ArgumentException: ключевое слово не поддерживается: «источник данных».
Такое же исключение возникает при замене EffortProviderConfiguration.RegisterProvider()
с настройками app.config.
При использовании точно такой же строки соединения для создания UsersDbContext
она преуспевает, и данные доступны. Кроме того, создание контекста с постоянным или переходным режимом Effort, без строки подключения, также хорошо работает.
Что нужно сделать для инициализации соединения с существующими данными из реальной БД?
Если, как и я, вы не понимаете, почему вам вообще нужно дать Effort строку подключения (поскольку она работает с базой данных в памяти, и вы предоставляете свой контекст для подключения напрямую), документация делает это немного более понятным - это требуется только в том случае, если вы используете варианты Entity Framework для базы данных или для модели, потому что строка подключения Entity предоставляет информацию, необходимую Effort для определения местоположения вашей модели, чтобы она могла построить из нее схему !! Таким образом, вы можете безопасно заполнить части строки подключения сервером / базой данных / идентификатором пользователя / паролем фиктивными именами.
Это также проясняет, что пользовательский подход DbConnectionFactory по умолчанию работает только для кода сначала, что объясняет первые несколько часов ошибок, которые я получаю ... Для модели сначала или базы данных сначала вы должны внедрить Entity Connection в ваш класс сущности , как описано здесь .
Полезный совет - поскольку ваш сгенерированный класс модели сущностей является частичным классом, вы можете создать другой файл кода в той же сборке, присвоить ему то же пространство имен и сделать его также частичным классом, а также добавить второй конструктор, необходимый для установки EntityConnection к этому файлу кода, таким образом, когда вы изменяете / воссоздаете свою модель сущности, код с пользовательским конструктором не будет удален шаблоном t4.