将SQL SERVER数据库改成MySql
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了将SQL SERVER数据库改成MySql,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3905字,纯文字阅读大概需要6分钟。
内容图文
![将SQL SERVER数据库改成MySql](/upload/InfoBanner/zyjiaocheng/1234/37e4dfeae9c346c2a4f606590e9d91e6.jpg)
格斗人网 (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包时,会有两个包被集成进工程,如下所示:
2. 然后是Web.config的修改。
在connectionStrings中去掉SQL SERVER相关的连接字符串,加入mysql的连接字符串,如下所示:
1 < connectionStrings > 2 < add name ="ConnectionName" 3 providerName ="MySql.Data.MySqlClient"
connectionString ="Server=xxx.xxx.xxx.xxx;Uid=xxx;Pwd=xxx;Database=xxxxx" /> 4 </ connectionStrings >
在providers中加入mysql的provider信息:
< providers > < provider invariantName ="MySql.Data.MySqlClient"
type ="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> </ providers >
在system.data中加入mysql的factory信息:
< system.data > < DbProviderFactories > < remove invariant ="MySql.Data.MySqlClient" ></ remove > < 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.8.3.0, Culture=neutral, PublicKeyToken=xxxx" /> </ DbProviderFactories > </ system.data >
3. 加入定制化的MigrationHistory context。这一节非常重要,重点参考了上述的那篇美文。
EF的Code First采用Migration History表来保证model和数据库的一致性。但是数据库换成Mysql后默认的主键长度超过了Mysql最大允许的767字节,所以必须修改主键长度,这里需要修改HistoryContext,可以新增加一个类来继承HistoryContext,如下所示:
1 public class MySqlHistoryContext : HistoryContext 2 { 3 public MySqlHistoryContext( 4 DbConnection existingConnection, 5 string defaultSchema) 6 : base(existingConnection, defaultSchema) 7 { } 8 9protectedoverridevoid OnModelCreating(DbModelBuilder modelBuilder) 10 { 11base.OnModelCreating(modelBuilder); 12 modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); 13 modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); 14 } 15 }
为了让EF使用修改后的HistoryContext,而不使用默认的HistoryContext,则需要增加类修改DbConfiguration:
1 public class MySqlConfiguration : DbConfiguration 2 { 3 public MySqlConfiguration() 4 { 5 SetHistoryContext("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); 6 } 7 }
4. MySql provider无法直接支持EF的migration和code first,需要增加一个定制化的EF initializer:
1 public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext> 2 { 3publicvoid InitializeDatabase(ApplicationDbContext context) 4 { 5if (!context.Database.Exists()) 6 { 7 context.Database.Create(); 8 } 9else10 { 11var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>( 12string.Format( 13"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = ‘{0}‘ AND table_name = ‘__MigrationHistory‘", 14"XXX数据库名"15 )); 1617if (migrationHistoryTableExists.FirstOrDefault() == 0) 18 { 19 context.Database.Delete(); 20 context.Database.Create(); 21 } 22 } 23 } 24 }
同时需要在DbContext中使用此定制化的initializer:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { static ApplicationDbContext() { Database.SetInitializer(new MySqlInitializer()); } publicvirtual DbSet<xxxx> xxxx { get; set; } public ApplicationDbContext() : base("xxxx连接名") { } }
5. 其它表的添加。前面所述EF的code first,基于EF架构中现有的ApplicationUser和ApplicationDbContext,如果需要新增加其它表,不能另外增加DbContext,不然会引起访问冲突,需要把表继续放入原来的ApplicationDbContext中,如上述代码中的DbSet<xxxx>。为这些表新建的类需要注意以下几点:
(1) 在类的顶部加上[Table(‘"xxxx表名")]以让该类与表相关。
(2) 在主键字段前面加上[Key]属性。
(3) 如果表中存在多个主键,在主键上除开添加[Key]属性以外,还需要添加[Column(Order = XX列号)]属性,以表明不同主键的顺序。否则会出现“无法确定组合主键排序”的错误。
原文:http://www.cnblogs.com/HelpQY/p/3873438.html
内容总结
以上是互联网集市为您收集整理的将SQL SERVER数据库改成MySql全部内容,希望文章能够帮你解决将SQL SERVER数据库改成MySql所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。