MySql Connector 6.8.2 RC, Entity Framework 6 и Code First
Недавно я обновил до Entity Framework 6 и установил RC-коннектор MySql 6.8.2, так как было заявлено, что сейчас поддерживается код EF6.
Имейте в виду, что до обновления мой проект работал нормально в коннекторе 6.7.4 и EF 5.
Я внес следующие изменения в свой web.config
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.2.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<connectionStrings>
<add providerName="MySql.Data.MySqlClient" name="dbcontext" connectionString="Server=localhost; Database=db; Uid=un; Pwd=pw;Convert Zero Datetime=True" />
</connectionStrings>
Я также добавил следующие ссылки (версии.net 4.5)
- MySql.Data
- MySql.Data.Entity.EF6
- MySql.Web
Проблема в том, что в тот момент, когда код вызывает DBContext, я получаю:
Object reference not set to an instance of an object.
Опять же - имейте в виду, что все работало до обновления, поэтому я знаю, что это не проблема кода, однако, возможно, я неправильно настроил web.config?
Кроме того - вы можете спросить, если он работал отлично до обновления, зачем обновлять? Ну, предположительно, EF6 и новый коннектор MySql устраняют некоторые ошибки, с которыми я столкнулся - поэтому я надеялся реализовать это сейчас, пока он находится в разработке и к тому времени, когда он перейдет в производство (через несколько месяцев), я смогу загрузить его серийная версия разъема 6.8.x.
Вот трассировка стека на случай, если это поможет
[NullReferenceException: Object reference not set to an instance of an object.]
MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection) +85
System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) +332
System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +67
System.Data.Entity.Infrastructure.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple`3 k) +63
System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) +72
System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) +260
System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest& providerManifest) +89
System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) +79
System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) +143
System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input) +171
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +594
System.Data.Entity.Internal.InternalContext.Initialize() +31
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +39
System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +138
System.Data.Entity.Internal.Linq.InternalSet`1.Include(String path) +41
System.Data.Entity.Infrastructure.DbQuery`1.Include(String path) +142
[edited].Global.Application_BeginRequest(Object sender, EventArgs e) in c:\edited\Global.asax.cs:47
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69
2 ответа
MySQL EF6 и Migrations были запущены и работали, когда все было в одном проекте MVC. Я разделил его на слои (Core[Interfaces/Entitites], Data, Services и Web) и начал получать ту же ошибку, о которой упоминала Лорен.
Выяснил, что он не выбирает строку подключения из приложения MVC. Оказывается, все, что мне нужно было сделать, это заново создать строку подключения в App.config в моем проекте данных (где находятся DbContext и сопоставления).
Вот шаги, которые я предпринял, чтобы все заработало:
Шаг 1) Используйте NuGet для импорта MySql.Data.Entities (текущая версия на этот пост 6.8.3.0)
Шаг 2) Добавьте следующее в App.config и / или Web.config:
<connectionStrings>
<add name="MyDB" providerName="MySql.Data.MySqlClient" connectionString="Data Source=localhost; port=3306; Initial Catalog=mydb; uid=myuser; pwd=mypass;" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
Шаг 3) Настройте ваш DbContext для использования MySql:
using MyApp.Core.Entities.Directory;
using MyApp.Data.Mapping;
using System.Data.Entity;
namespace MyApp.Data
{
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MyContext : DbContext
{
public MyContext() : this("MyDB") { }
public MyContext(string connStringName) : base(connStringName) {}
static MyContext ()
{
// static constructors are guaranteed to only fire once per application.
// I do this here instead of App_Start so I can avoid including EF
// in my MVC project (I use UnitOfWork/Repository pattern instead)
DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());
}
public DbSet<Country> Countries { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// I have an abstract base EntityMap class that maps Ids for my entities.
// It is used as the base for all my class mappings
modelBuilder.Configurations.AddFromAssembly(typeof(EntityMap<>).Assembly);
base.OnModelCreating(modelBuilder);
}
}
}
Шаг 4) Установите для проекта по умолчанию ваш проект данных в консоли диспетчера пакетов
Шаг 5) Используйте enable-migrations
, add-migration
, update-database
как обычно
ContosoUniversity MVC5 + EF6 сначала использует код с использованием примера загрузки MySQL: http://www.nzmk.com/Blogs/BlogsView/tabid/83/EntryId/8/MVC5-EF6-ContosoUniversity-code-first-approach-using-MySQL.aspx
Чтобы начать использовать Entity Framework 6 и Visual Studio 2013, необходимо установить MySQL для Visual Studio 1.1.1 MySQL, Connector/Net 6.8.3 GA
Бета-версию MySQL для Visual Studio 1.1.1 можно загрузить по следующей ссылке: cdn.mysql.com/Downloads/MySQLInstaller/mysql-visualstudio-plugin-1.1.1.msi
MySQL Connector/Net 6.8.3 GA dev.mysql.com/downloads/connector/net/
Для начала работы с VS 2013 и EF 6
- Удалите старые версии MySQL для Visual Studio и Connector / Net
- Установите MySQL для Visual Studio 1.1.1
- Установите Соединитель / Сеть 6.8.3
- Добавьте ссылку на сборки MySql.Data, MySql.Data.Entity.EF6, MySql.Web (версия 6.8.3.0) в проект. В зависимости от используемого.NET Framework сборка должна быть взята из папки v4.0 или v4.5).
Отредактируйте web.config или app.config
<connectionStrings> <add name='SchoolContext' connectionString='Data Source=xxxxx;port=3306;Initial Catalog=ContosoUniversity;user id=root;password=xxxxxxxxx;' providerName='MySql.Data.MySqlClient'/> </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 '/>
Редактировать SchoolContext.cs
.... используя MySql.Data.Entity;
namespace ContosoUniversity.DAL { [DbConfigurationType(typeof(MySqlEFConfiguration))] public class SchoolContext : DbContext { .... } }
Изменить Global.asax.cs
...... используя MySql.Data.Entity;
namespace ContosoUniversity { public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); DbConfiguration.SetConfiguration(new MySqlEFConfiguration()); } } }
У меня была та же проблема, и я решил следующее: я выполнил шаги первого ответа, и в моем случае мне это не удалось. В поисках я нашел эту ссылку:
https://github.com/timdinhdotcom/MySql.AspNetIdentity
только с разницей, где написано:
<entityFramework codeConfigurationType = "MySql.AspNetIdentity.MySqlEFConfiguration, MySql.AspNetIdentity">
я просто оставил
<entityFramework>