发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
格斗人网 (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 9 protected override void OnModelCreating(DbModelBuilder modelBuilder) 10 { 11 base.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 { 3 public void InitializeDatabase(ApplicationDbContext context) 4 { 5 if (!context.Database.Exists()) 6 { 7 context.Database.Create(); 8 } 9 else 10 { 11 var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>( 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<ApplicationUser> { static ApplicationDbContext() { Database.SetInitializer(new MySqlInitializer()); } public virtual DbSet<xxxx> xxxx { get; set; } public ApplicationDbContext() : base("xxxx连接名") { } }
来自: 昵称10504424 > 《工作》
0条评论
发表
请遵守用户 评论公约
PowerDesigner中如何生成主键和自增列--SQL SERVER版本 - NetS...
第一步,首先要建立与数据库的连接,方法较多,这里举个例子:第二个,打开PD15,新建一个PDM文档,然后新建一个表,如图所示:第4步,...
[PowerDesign]将数据库从SQL Server数据库转换为MySQL
[PowerDesign]将数据库从SQL Server数据库转换为MySQL原文:单击确定后即可生成MySQL的物理模型 然后单击“Database”菜单下的“Generate...
DB-Engines:关系型数据库的争霸赛
第二张图表展示了 Oracle 和 MySQL 的积分相关性,往往,两者具有对立的趋势,也就是说:当Oracle上升,MySQL下降,反之亦然。而Oracle的Database 12.2直至2017年3月才发布,也是行业内Oracle的声音较...
用DAO连接SQL SERVER数据库
用DAO连接SQL SERVER数据库Dim cn As DAO.DatabaseSet cn = OpenDatabase("", 0, 0, "ODBC;Driver=SQL Server;server=155.29.12.15;UID=sa;PWD=11;DATABASE=deg")
Entity Framework
Entity Framework Entity Framework Entity Framework 6:专家版本。EF6 中有许多这样的功能:支持异步查询和保存、返回自定义 Code ...
mysql 利用bat文件导入导出sql文件
set path_home_mysql=C:\Program Files\MySQL\MySQL Server 5.0\/* MySQL安装的BIN目录 (双引号不能少) 特别是注意空格 */set path_bin_mysql="C:\\Program Files\\MySQL\\MySQL Server 5.0\\bin\...
如何在ASP中连接MySQL数据库
选择 MySQL ODBC 3.51 Driver。<html><head> <title>MySQL连接测试</title> <meta http-equiv="Cont...
最新Oracle 和 mysql 的对比参照----管理篇
最新Oracle 和 mysql 的对比参照----管理篇。C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqladmin -u root -p shutdown.linux cp /usr/local/mysql/support-files/mysql.server /etc/init.d/my...
php5 操作MYSQL的类
php5 操作MYSQL的类php5 操作MYSQL的类。
微信扫码,在手机上查看选中内容