Одно и то же приложение, разные базы данных: Entity Framework 6.X + MySQL + SQL Server
Вчера я выполнил миграцию (EF 5.0 => EF 6.0) веб-приложения, которое использует инфраструктуру сущностей для доступа к базам данных MySql и SQL Server (в частности,DbContext
к конкретным базам данных, а неDbContext
в любой тип базы данных).
Во время компиляции все было сделано без проблем, во время выполнения я столкнулся с исключением:
Экземпляр DbConfiguration по умолчанию использовался Entity Framework до обнаружения типа «MySqlEFConfiguration».
[DbConfigurationType(typeof(MySqlEFConfiguration))]
атрибут в контексте, кажется, был проигнорирован во время выполнения, потому что контекст находится во внешней сборке (?) иDbConfiguration
вместо этого используется глобально для домена приложения, а не для контекста (?). "
Я пробовал разные подходы, чтобы исправить это, затем погуглил и - удивительно - не нашел рабочего решения.
Похоже, описанная здесь ситуация сложилась хорошо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 (new 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 (new 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, которая явно неверна.