【问题标题】:MySql Connector 6.8.2 RC, Entity Framework 6 and Code FirstMySql 连接器 6.8.2 RC、实体框架 6 和代码优先
【发布时间】:2014-01-03 07:46:29
【问题描述】:

我最近升级到 Entity Framework 6 并安装了 MySql 6.8.2 RC 连接器,因为它表示现在支持 EF6 Code First。

请记住,在升级之前,我的项目在连接器 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 版本)

  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,所以它是一个测试版。
  • 我不确定这是否是一个错误,或者是否有新的/差异方式来设置它 - 但是我也确实在 mysql 论坛上发布了这个。所以如果我在那里得到答案,我也会在这里更新它
  • mysql论坛中问题的链接怎么样?
  • @99823 您找到导致此问题的原因了吗?
  • 我将web项目设置为启动项目,然后就成功了。

标签: c# mysql entity-framework ef-code-first


【解决方案1】:

当一切都在一个 MVC 项目中时,我有 MySQL EF6 和 Migrations 并开始工作。我将其拆分为多个层(Core[Interfaces/Entitites]、Data、Services 和 Web)并开始遇到 Loren 提到的相同错误。

发现它没有从 MVC 应用程序中获取连接字符串。事实证明,我所要做的就是在我的 Data 项目(DbContext 和映射所在的位置)的 App.config 中重新创建连接字符串。

这些是我为使一切正常工作所采取的步骤:

第 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-migrationsadd-migrationupdate-database

【讨论】:

  • 我遇到了类似的问题。拆分时,我必须将我的connectionStrings 添加到app.config(数据项目)和web.config。 packagemanager 控制台使用 app.config 之一,mvc 网站使用web.config
  • 那是你不能对 Sql 和 Mysql 使用相同的代码:你必须标记你的 DbContext 类???
  • 实际上你可以在 app.config 中使用&lt;entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, mysql.data.entity.EF6"&gt;...&lt;/entityFramework&gt; 而不是类属性。
【解决方案2】:

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,需要安装 适用于 Visual Studio 1.1.1 的 MySQL MySQL 连接器/网络 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 连接器/网络 6.8.3 GA dev.mysql.com/downloads/connector/net/

开始使用 VS 2013 和 EF 6

  1. 卸载旧版本的 MySQL for Visual Studio 和 Connector/Net
  2. 为 Visual Studio 1.1.1 安装 MySQL
  3. 安装连接器/网络 6.8.3
  4. 将 MySql.Data、MySql.Data.Entity.EF6、MySql.Web(版本 6.8.3.0)程序集的引用添加到项目中。根据所使用的 .NET Framework,程序集将从 v4.0 或 v4.5 文件夹中获取。
  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' />

  6. 编辑 SchoolContext.cs

    .... 使用 MySql.Data.Entity;

    namespace ContosoUniversity.DAL
    {
      [DbConfigurationType(typeof(MySqlEFConfiguration))]
      public class SchoolContext : DbContext
      {
      ....
      }
    }
    
  7. 编辑 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());
            }
        }
    }
    

【讨论】:

    猜你喜欢
    • 2015-04-09
    • 2012-12-30
    • 2014-03-23
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    相关资源
    最近更新 更多