sql数据库换成mysql复杂不_将SQL SERVER数据库改成MySql

(www.helpqy.com) 架构在阿里云上,最先想采用SQL SERVER,想大家都是微软家族的嘛。但是发现SQL SERVER需要的配置比较高,需要的银子也比较多,最后在纠结之下换成了MySql。由于整个网站基于微软的asp.net MVC架构,同时基于EF6.0,而MVC架构默认采用了SQL SERVER,这里又与code first混合在一起,所以在修改和过渡过程中还是遇到了不少问题。这个过程中参考了博客园不少前辈的文章,真是太感谢了。其中主要参考的一篇外文是:“ASP.NET Identity: Using MySQL Storage with an EntityFramework MySQL Provider (C#)”。时间太长了,现在在总结和回忆,可能还是会遗漏掉一些细节,请各位,也请我自己谅解哈,嘿嘿。

1. 通过NuGet下载Mysql的provider,以便EF能够连接Mysql数据库。下载MySql.Data.Entity包时,会有两个包被集成进工程,如下所示:

4eece56fb75461129a1f13782d6ce118.png

2. 然后是Web.config的修改。

在connectionStrings中去掉SQL SERVER相关的连接字符串,加入mysql的连接字符串,如下所示:

1

2

3 providerName="MySql.Data.MySqlClient"connectionString="Server=xxx.xxx.xxx.xxx;Uid=xxx;Pwd=xxx;Database=xxxxx" />

4

在providers中加入mysql的provider信息:

在system.data中加入mysql的factory信息:

3. 加入定制化的MigrationHistory context。这一节非常重要,重点参考了上述的那篇美文。

EF的Code First采用Migration History表来保证model和数据库的一致性。但是数据库换成Mysql后默认的主键长度超过了Mysql最大允许的767字节,所以必须修改主键长度,这里需要修改HistoryContext,可以新增加一个类来继承HistoryContext,如下所示:

1 public classMySqlHistoryContext : HistoryContext2 {3 publicMySqlHistoryContext(4 DbConnection existingConnection,5 stringdefaultSchema)6 : base(existingConnection, defaultSchema)7 { }8

9 protected override voidOnModelCreating(DbModelBuilder modelBuilder)10 {11 base.OnModelCreating(modelBuilder);12 modelBuilder.Entity().Property(h => h.MigrationId).HasMaxLength(100).IsRequired();13 modelBuilder.Entity().Property(h => h.ContextKey).HasMaxLength(200).IsRequired();14 }15 }

为了让EF使用修改后的HistoryContext,而不使用默认的HistoryContext,则需要增加类修改DbConfiguration:

1 public classMySqlConfiguration : DbConfiguration2 {3 publicMySqlConfiguration()4 {5 SetHistoryContext("MySql.Data.MySqlClient", (conn, schema) => newMySqlHistoryContext(conn, schema));6 }7 }

4. MySql provider无法直接支持EF的migration和code first,需要增加一个定制化的EF initializer:

1 public class MySqlInitializer : IDatabaseInitializer

2 {3 public voidInitializeDatabase(ApplicationDbContext context)4 {5 if (!context.Database.Exists())6 {7 context.Database.Create();8 }9 else

10 {11 var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery(12 string.Format(13 "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",14 "XXX数据库名"

15 ));16

17 if (migrationHistoryTableExists.FirstOrDefault() == 0)18 {19 context.Database.Delete();20 context.Database.Create();21 }22 }23 }24 }

同时需要在DbContext中使用此定制化的initializer:

public class ApplicationDbContext : IdentityDbContext{staticApplicationDbContext()

{

Database.SetInitializer(newMySqlInitializer());

}public virtual DbSet xxxx { get; set; }publicApplicationDbContext()

:base("xxxx连接名")

{

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值