MySql Connector 6.8.2 RC,Entity Framework 6和Code First

8

我最近升级到了Entity Framework 6,并安装了MySql 6.8.2 RC Connector,因为它声称现在支持EF6 Code First。

请注意,在升级之前,我的项目在运行连接器6.7.4和EF5的情况下正常运行。

我对我的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版本)

  1. MySql.Data
  2. MySql.Data.Entity.EF6
  3. 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

你不应该在项目支持网站上报告这个问题/缺陷吗?既然它是一个 RC,那就是一个测试版。 - Kelmen
我不确定这是一个错误还是有一种新的/不同的设置方法 - 不过我也在mysql论坛上发布了这个问题。所以如果我在那里得到答案,我也会在这里更新。 - 99823
在MySQL论坛中提供一个问题链接怎么样? - MacX
@99823 你找出导致这个问题的原因了吗? - Sharique Abdullah
我将Web项目设置为启动项目,然后它就可以工作了。 - Jia Yang
我投票关闭此问题,因为它涉及到一个发布候选版本,并且没有说明问题是否在最终版本中仍然存在。 - Gert Arnold
2个回答

27

当所有内容都在一个MVC项目中时,我成功安装并使用了MySQL EF6和迁移。但当我将其拆分成几个层(Core [Interfaces/Entities]、Data、Services和Web)后,开始出现与Loren提到的错误相同的问题。

后来发现它无法从MVC应用程序中获取连接字符串。原来我只需要在Data项目(包含DbContext和映射)的App.config中重新创建连接字符串即可。

以下是我采取的步骤:

第1步)使用NuGet导入(当前版本为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>

第三步)设置您的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-migrationsadd-migrationupdate-database


我遇到了类似的问题。当我分离内容时,我必须将我的connectionStrings添加到app.config(Data项目)和web.config中。PackageManager控制台使用app.config,而mvc网站则使用web.config - Hugo Delsing
你不能在Sql和Mysql中使用相同的代码:你必须标记你的DbContext类。 - tschmit007
2
实际上,您可以在app.config中使用<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, mysql.data.entity.EF6">...</entityFramework>而不是类属性。 - tschmit007

5

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 for Visual Studio 1.1.1 MySQL Connector/Net 6.8.3 GA

可以使用以下链接下载MySQL for Visual Studio 1.1.1 Beta: 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

  1. Uninstall old versions of MySQL for Visual Studio and Connector/Net
  2. Install MySQL for Visual Studio 1.1.1
  3. Install Connector/Net 6.8.3
  4. Add the reference for MySql.Data, MySql.Data.Entity.EF6, MySql.Web (Version 6.8.3.0) assemblies into the project. Depending on the .NET Framework used, the assembly is to be taken from either the v4.0 or the v4.5 folder).
  5. Edit web.config or 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' />

  6. Edit SchoolContext.cs

    .... using MySql.Data.Entity;

    namespace ContosoUniversity.DAL
    {
      [DbConfigurationType(typeof(MySqlEFConfiguration))]
      public class SchoolContext : DbContext
      {
      ....
      }
    }
    
  7. Edit Global.asax.cs

    ...... using 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());
            }
        }
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接