Entity Framework Code First For MySql 之数据库迁移
这里只上干货~!
- 首先我们需要下载安装
这里是下载地址拿去不谢~! https://downloads.mysql.com/archives/ 。什么找不到软件?小弟只能帮大哥到这里了。
- 接着创建一个项目DEMO4:
- 新建项目,创建ADO.NET实体数据模型,注意最好命名一个DbContext后缀的类,但是随你~!
,
1 namespace DEMO4 2 { 3 using System; 4 using System.Data.Entity; 5 using System.Linq; 6 7 public class Model1 : DbContext 8 { 9 //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config) 10 //使用“Model1”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的 11 //“DEMO4.Model1”数据库。 12 // 13 //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Model1” 14 //连接字符串。 15 public Model1() 16 : base("name=Model1") 17 { 18 } 19 20 //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First 模型 21 //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。 22 23 public virtual DbSet<MyEntity> MyEntities { get; set; } 24 } 25 26 public class MyEntity 27 { 28 public int Id { get; set; } 29 public string Name { get; set; } 30 } 31 }
将注释掉的内容去掉注释。
- 接下来我们运行命令喽:
第一个命令 Enable-Migrations -EnableAutomaticMigrations
来了,问题终于来了……
正在检查上下文的目标是否为现有数据库...
System.InvalidOperationException: 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
在 System.Data.Entity.Infrastructure.DbContextInfo.CreateInstance()
在 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.MigrationScaffolder..ctor(DbMigrationsConfiguration migrationsConfiguration)
在 System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()
在 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=260882。
遇到问题不怕看不懂就怕你急躁,越急躁越不能解决问题。上面的描述告诉我们,缺少“MySql.Data.MySqlClient”,EF怎么知道我要连接的是MYSQL数据库的呢?别去管他,也许是我本机并未安装SQL SERVER。
接下来,我们安装MySql.Data.Entity 6.9.12 ,并修改App.config。
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <configSections> 4 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 6 </configSections> 7 <entityFramework> 8 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 9 <providers> 10 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> 11 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 12 </providers> 13 </entityFramework> 14 <connectionStrings> 15 <add name="Model1" connectionString="data source=127.0.0.1;initial catalog=DEMO4.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="MySql.Data.MySqlClient" /> 16 </connectionStrings> 17 <system.data> 18 <DbProviderFactories> 19 <remove invariant="MySql.Data.MySqlClient" /> 20 <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.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 21 </DbProviderFactories> 22 </system.data> 23 </configuration>
接下来,再执行一下命令 Enable-Migrations -EnableAutomaticMigrations,问题又来了,不过这个问题倒是好解决。
已在项目“DEMO4”中启用迁移。若要覆盖现有迁移配置,请使用 -Force 参数。
将命令 Enable-Migrations -EnableAutomaticMigrations 换成 Enable-Migrations -EnableAutomaticMigrations -Force,运行命令,问题又来了
Keyword not supported.
参数名: multipleactiveresultsets
连接语句不支持参数multipleactiveresultsets,咋办,去掉呗~!再运行 Enable-Migrations -EnableAutomaticMigrations -Force
Keyword not supported.
参数名: app
去掉去掉~!再运行 Enable-Migrations -EnableAutomaticMigrations -Force 这次终于没毛病了~! App.config内容如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <configSections> 4 <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 5 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 6 </configSections> 7 <entityFramework> 8 <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 9 <providers> 10 <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> 11 <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 12 </providers> 13 </entityFramework> 14 15 <system.data> 16 <DbProviderFactories> 17 <remove invariant="MySql.Data.MySqlClient" /> 18 <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.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 19 </DbProviderFactories> 20 21 </system.data> 22 <connectionStrings> 23 <add name="Model1" connectionString="data source=127.0.0.1;initial catalog=Model1;integrated security=True" providerName="MySql.Data.MySqlClient" /> 24 </connectionStrings> 25 </configuration>
接下来执行命令 Add-Migration InitialCreate,好吧,问题又来了:
未为提供程序“MySql.Data.MySqlClient”找到任何 MigrationSqlGenerator。请在目标迁移配置类中使用 SetSqlGenerator 方法以注册其他 SQL 生成器。
在Model1.cs中添加
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
构造函数中添加
public Model1(): base("name=Model1")
{
System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Model1>());
DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration());
}
1 namespace DEMO4 2 { 3 using System; 4 using System.Data.Entity; 5 using System.Linq; 6 [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] 7 public class Model1 : DbContext 8 { 9 //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config) 10 //使用“Model1”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的 11 //“DEMO4.Model1”数据库。 12 // 13 //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Model1” 14 //连接字符串。 15 public Model1() 16 : base("name=Model1") 17 { 18 System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Model1>()); 19 DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration()); 20 } 21 22 //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First 模型 23 //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。 24 25 public virtual DbSet<MyEntity> MyEntities { get; set; } 26 } 27 28 public class MyEntity 29 { 30 public int Id { get; set; } 31 public string Name { get; set; } 32 } 33 }
接下来执行命令 Add-Migration InitialCreate,成功时这个样子滴。生成了一个201812040228323_InitialCreate.cs 文件
接下来执行命令 Add-Migration InitialCreate,问题又来了
Access denied for user ''@'localhost' to database 'model1'
没有账户密码……修改App.config文件如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </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.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="Model1" connectionString="data source=127.0.0.1;initial catalog=Model1;integrated security=True;user id=root;password=123456;port=3306" providerName="MySql.Data.MySqlClient" /> </connectionStrings> </configuration>
接下来我们 添加一个表 MyEntity2
namespace DEMO4 { using System; using System.Data.Entity; using System.Linq; [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class Model1 : DbContext { //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config) //使用“Model1”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的 //“DEMO4.Model1”数据库。 // //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“Model1” //连接字符串。 public Model1() : base("name=Model1") { System.Data.Entity.Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Model1>()); DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration()); } //为您要在模型中包含的每种实体类型都添加 DbSet。有关配置和使用 Code First 模型 //的详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=390109。 public virtual DbSet<MyEntity> MyEntities { get; set; } public virtual DbSet<MyEntity2> MyEntities2 { get; set; } } public class MyEntity { public int Id { get; set; } public string Name { get; set; } } public class MyEntity2 { public int Id { get; set; } public string Name { get; set; } } }
接下来执行命令 Add-Migration MyEntity2
接下来执行命令 Update-Database -Verbose