Вчера я выполнил миграцию (EF 5.0 = > EF 6.0) веб-приложения, которое использует инфраструктуру сущности для доступа к базам данных MySql и SQL Server (в частности DbContext
к конкретным базам данных, а не к любому DbContext
к любому типу базы данных).
Время компиляции было выполнено без каких-либо проблем, время выполнения столкнулось со мной с исключением:
Экземпляр DbConfiguration по умолчанию использовался платформой Entity Framework до того, как был обнаружен тип "MySqlEFConfiguration".
Атрибут [DbConfigurationType(typeof(MySqlEFConfiguration))]
в контексте, как представляется, был проигнорирован во время выполнения, потому что контекст находится во внешней сборке (?), а используемый DbConfiguration
глобальный для домена приложения, а не для контекста (?) ".
Я пробовал разные подходы, чтобы исправить это, затем перешел в Google и - неожиданно - не нашел рабочего решения.
Похоже, что описанная здесь ситуация хорошо сформирована http://forums.mysql.com/read.php?174,614148,614148 все еще не изменилась, или я пропустил некоторые очевидные вещи.
Любая обратная связь будет оценена по достоинству.
Заранее благодарю вас!
ПОДРОБНОЕ ОПИСАНИЕ:
Вход (упрощенный): - Веб-приложение ASP.NET
-
Уровень доступа к данным, реализованный через Entity Framework 6.1.1
-
Поставщики платформы Entity Framework:
-
System.Data.SqlClient 6.1.1
-
MySql.Data.MySqlClient 6.9.4
-
-
MY_SqlContext, первая концепция модели, предназначенная для базы данных MY SQL Server
-
Ms_SqlContext, первая концепция базы данных, предназначенная для базы данных MS SQL Server
В соответствии с общей документацией документации Entity Framework 6 и MySql Connector/Net (http://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html), MY_SqlContext требует применения MySqlEFConfiguration.
Согласно обеим документам, упомянутым выше, для этого есть три варианта. Все трое были судимы и потерпели неудачу.
Вариант 1: добавление атрибута DbConfigurationTypeAttribute [DbConfigurationType(typeof(MySqlEFConfiguration))]
в класс MY_SqlContext
Соответствующие сегменты Web.config:
<connectionStrings>
<add name="MY_SqlContext"
connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
providerName="MySql.Data.MySqlClient" />
<add name="Ms_SqlContext"
connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
providerName="System.Data.EntityClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
После запуска приложений и начала работы веб-запросов:
Ms_SqlContext отлично работает, но пытается создать экземпляр MY_SqlContext, я получаю исключение:
Экземпляр DbConfiguration по умолчанию использовался платформой Entity Framework до того, как был обнаружен тип "MySqlEFConfiguration". Экземпляр "MySqlEFConfiguration" должен быть установлен при запуске приложения перед использованием любых функций Entity Framework или должен быть зарегистрирован в файле конфигурации приложения. См.... LinkId = 260883 для получения дополнительной информации. "
Вариант 2: вызов DbConfiguration.SetConfiguration(новый MySqlEFConfiguration()) при запуске приложения
Соответствующие сегменты Web.config(аналогично варианту 1, фактически):
<connectionStrings>
<add name="MY_SqlContext"
connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
providerName="MySql.Data.MySqlClient" />
<add name="Ms_SqlContext"
connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
providerName="System.Data.EntityClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
Код, добавленный в Global.asax.cs: private void Application_Start (отправитель объекта, EventArgs e) { DbConfiguration.SetConfiguration(новый MySqlEFConfiguration()); ...
После запуска приложений и начала веб-запросов при попытке создания экземпляра Ms_SqlContext я получаю исключение:
Был установлен экземпляр "MySqlEFConfiguration", но этот тип не был обнаружен в той же сборке, что и контекст "Ms_SqlContext". Либо введите тип DbConfiguration в ту же сборку, что и тип DbContext, используйте DbConfigurationTypeAttribute в типе DbContext, чтобы указать тип DbConfiguration, или задайте тип DbConfiguration в файле конфигурации. Подробнее... LinkId = 260883.
Вариант 3: установите тип DbConfiguration в файле конфигурации
Соответствующие сегменты Web.config
<connectionStrings>
<add name="MY_SqlContext"
connectionString="server=.;User Id=root;password=...;Persist Security Info=True;database=MySqlDb;Use Compression=False;Use Old Syntax=False"
providerName="MySql.Data.MySqlClient" />
<add name="Ms_SqlContext"
connectionString="metadata=res://*/Ms_SqlContext.csdl|res://*/Ms_SqlContext.ssdl|res://*/Ms_SqlContext.msl;provider=System.Data.SqlClient;provider connection string="data source=.;initial catalog=MsSqlDb;User ID=appuser;Password=...""
providerName="System.Data.EntityClient" />
</connectionStrings>
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
После запуска приложений и начала работы веб-запросов: ... Создается экземпляр Ms_SqlContext, но во время первого выполнения запроса я получаю исключение:
EntityException: { "Исходный провайдер отказался при открытии." }
InnerException: { "Невозможно подключиться к любому из указанных узлов MySQL." }
Итак, Ms_SqlContext получает конфигурацию MySql, которая, очевидно, неверна.