EF6 Codefirst+MySql 数据库迁移

Posted 天北涯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF6 Codefirst+MySql 数据库迁移相关的知识,希望对你有一定的参考价值。

简介

项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到mysql,顺带迁移过程以及问题。

环境

· Visual Studio 2013

· MySQL 5.7

· Entity Framework 6.1.3

正文

迁移过程

1. 安装MySQL,顺带安装 MySQL for Visual Studio、MySQL Connector Net

2. 在Entity Framework 项目和 WebSite项目中添加Nuget包,MySql.Data.Entity,我这里添加的是6.9.6版本,添加时后会把MySQL.Data作为依赖项加入到项目中,完成后可以看到web.config和app.config下增加了MySQL的 provider和DbProvideFactories。

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
<system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" 
           type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

 

3. 修改Web.config的连接字符串,providerName修改成:MySql.Data.MySqlClient。

<add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=Demo;User ID=root;Password=root" />

 

4. 回到EntityFramework项目中,找到DbContext类,为类添加属性:[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]

   [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
    public class MyDbContext : DbContext
    {
        /// <summary>
        /// 设置数据实体对应的数据库连接
        /// </summary>
        public MyDbContext() : base("DefaultConnection")
        {
        }
        
        //用Fluent api必须重写OnModelCreating方法
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
        }
    }

 

5. OK,这些工作做完,基本就可以了,打开程序包管理器控制台,虔诚祈祷,然后输入:update-database

 

迁移过程问题

1. 未将对象引用设置到对象的实例。

问题描述:这是一个比较通用的错误提示,很多Error都会提示这个,网上找了一些不太对,最后发现是因为启动项设置为EF项目,同时默认项目也是EF项目,因为在config文件中不到连接字符串导致的。

解决方案:在EF的app.config中添加连接串,或者启动项目设置为WebSite。

clip_image005

 

 

2. underlying provider does not support the type \'nvarchar(max)\'.

问题描述:字面意思就是说,provider不支持类型”nvarchar(max)”,这与MySQL数据库支持的数据类型有关系。

clip_image006

解决方案:找一下Entity定义中是不是有string类型,添加 属性如:     [StringLength(1000)],然后问题解决。

 

 

3. 提供程序未返回 ProviderManifestToken 字符串。

clip_image007

问题原因:连接字符串写错了 。

正确写法:data source不能用.代替

<add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="Data Source=127.0.0.1;Initial Catalog=demo;User ID=root;Password=root" />

 

4. 未解析成员“MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyT

System.Runtime.Serialization.SerializationException:  
未解析成员“MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”的类型。
在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
在 System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()  在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)  
未解析成员“MySql.Data.MySqlClient.MySqlException,MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”的类型。

解决方案:一般发生在从原来开发环境换到新的开发环境,在开发环境中缺少“mysql-connector-net”这个东西 ,下载安装即可。

 

5. 从索引 0 处开始,初始化字符串的格式不符合规范。

问题描述:这个问题和第一个差不多,只不过换了个提示方式,因为我在项目中有没有将包含连接字符串的项目设置为启动项,导致webconfig中缺少连接字符串导致的。

PM> update-database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
System.ArgumentException: 从索引 0 处开始,初始化字符串的格式不符合规范。
   在 System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue)
   在 System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey)
   在 System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules)
   在 System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
   在 MySql.Data.MySqlClient.MySqlConnectionStringBuilder..ctor(String connStr)
   在 MySql.Data.MySqlClient.MySqlConnection.set_ConnectionString(String value)
   在 MySql.Data.MySqlClient.MySqlConnection..ctor(String connectionString)
   在 MySql.Data.Entity.MySqlConnectionFactory.CreateConnection(String connectionString)
   在 System.Data.Entity.Internal.LazyInternalConnection.Initialize()
   在 System.Data.Entity.Internal.LazyInternalConnection.get_Connection()
   在 System.Data.Entity.Internal.LazyInternalContext.get_Connection()
   在 System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbProviderInfo modelProviderInfo, AppConfig config, DbConnectionInfo connectionInfo, Func`1 resolver)
   在 System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext, DatabaseExistenceState existenceState, Boolean calledByCreateDatabase)
   在 System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
   在 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator()
   在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   在 System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
从索引 0 处开始,初始化字符串的格式不符合规范。

解决方案:将包含连接字符串的项目设置为启动项目,将包含dbContext的项目设置为默认迁移项目,就是程序包管理控制台中的默认项目

以上是关于EF6 Codefirst+MySql 数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

EF6 CodeFirst使用MySql

使用 EF6(和 Code First 迁移)针对不同的数据库系统

oracle 用户在 EF6 Code First 中创建数据库和执行挂起迁移的最低权限是啥

EF6 Migration 自动迁移未执行

EF命令行工具 migrate.exe 进行Code First更新数据库,6.3+使用ef6.exe

20.1翻译系列:EF 6中自动数据迁移技术EF 6 Code-First系列