将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包时,会有两个包被集成进工程,如下所示:
2. 然后是Web.config的修改。
在connectionStrings中去掉SQL SERVER相关的连接字符串,加入mysql的连接字符串,如下所示:
<connectionStrings>
<add name="ConnectionName"
providerName="MySql.Data.MySqlClient"
connectionString="Server=xxx.xxx.xxx.xxx;Uid=xxx;Pwd=xxx;Database=xxxxx" />
</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,如下所示:
public class MySqlHistoryContext : HistoryContext
{
public MySqlHistoryContext(
DbConnection existingConnection,
string defaultSchema)
: base(existingConnection, defaultSchema)
{ } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength().IsRequired();
modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength().IsRequired();
}
}
为了让EF使用修改后的HistoryContext,而不使用默认的HistoryContext,则需要增加类修改DbConfiguration:
public class MySqlConfiguration : DbConfiguration
{
public MySqlConfiguration()
{
SetHistoryContext("MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema));
}
}
4. MySql provider无法直接支持EF的migration和code first,需要增加一个定制化的EF initializer:
public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext>
{
public void InitializeDatabase(ApplicationDbContext context)
{
if (!context.Database.Exists())
{
context.Database.Create();
}
else
{
var migrationHistoryTableExists = ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
string.Format(
"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '__MigrationHistory'",
"XXX数据库名"
)); if (migrationHistoryTableExists.FirstOrDefault() == )
{
context.Database.Delete();
context.Database.Create();
}
}
}
}
同时需要在DbContext中使用此定制化的initializer:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
static ApplicationDbContext()
{
Database.SetInitializer(new MySqlInitializer());
} public virtual DbSet<xxxx> xxxx { get; set; }
public ApplicationDbContext()
: base("xxxx连接名")
{
}
}
将SQL SERVER数据库改成MySql的更多相关文章
- SQL Server数据库转换成oracle
来源:http://blog.csdn.net/hzfu007/article/details/6182151 经常碰到需要把sql server的数据迁移到Oracle的情况. 在网上查找一下,有很 ...
- 如何连接oracle,mysql, SQL Server数据库(Java版)
先添加上连接oracle,MySQL的驱动路径和数据库连接URL: MySQL: final String DBDRIVER = "org.gjt.mm.mysql.Driver" ...
- [PowerDesign]将数据库从SQL Server数据库转换为MySQL
原文:[PowerDesign]将数据库从SQL Server数据库转换为MySQL 一.迁移Database Schema. 首先使用Sybase Powerdesigner的逆向工程功能,逆向出S ...
- 数据库 --> SQL Server 和 Oracle 以及 MySQL 区别
SQL Server 和 Oracle 以及 MySQL 区别 三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性.排行第四的DB2(属IBM公司),与Oracle的定位和架构非 ...
- Oracle,SQL Server 数据库较MySql数据库,Sql语句差异
原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...
- 数据库迁移(SQL SERVER导入数据到MySql)
地址:http://blog.csdn.net/jiaohougenyang/article/details/44937801 背景:项目最开始时使用的是SQL Server数据库,业务需求现要将数据 ...
- SQL Server connect to MySQL SQL Server通过LinkServer访问MySQL数据库,并操作mysql数据库代码
SQL Server 中需要访问MySQL的数据,可以通过调用MySQL的ODBC驱动,在SQL Server中添加LinkServer的方式实现. 1.从MySQL网站下载最新的MySQL ODBC ...
- 【转】SQL Server、Oracle、MySQL和Vertica数据库常用函数对比
SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 1. 绝对值 S:select abs(-1) valu ...
- SQL Server数据库和MySQL数据库有什么区别?
SQL Server数据库和MySQL数据库有什么区别呢?详细很多初入IT行业的朋友对于SQL Server数据库和MySQL数据库经常搞混,认为这两种数据库是同一种,其实不然,今天我们来分析一下这两 ...
随机推荐
- 关于在gridview中有dorpdownlist的情况下使用自带编辑模板的方法
今天记录一下在gridview中,如果有dropdownlist的情况下使用gridview自带编辑模式的方法. 好吧,今天的这个问题有点绕,详细解释一下目的. 因为gridview中的某些列的数据是 ...
- C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...
- 云端卫士实战录 | Java高级特性之多线程
<实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...
- url中,中文乱码的问题
1// 在jsp中 String add = java.net.URLEncoder.encode("添加", "utf-8"); add = java.net ...
- php 使用 极光推送 类
<?php /** * 安卓和苹果消息主推 */ class JPush extends CComponent { private $_push_body = array(); private ...
- 基本套接字编程(7) -- udp篇
1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互 ...
- android混淆那些事
写给Android开发者的混淆使用手册 综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆. 首先,这里说的的混淆其实是包括了代码压缩.代码混淆以及 ...
- 在Windows server 2008 R2上安装Python3.5
最近弄了台机器,把以前的一些东西移植到这台机器上去,先远程看一下机器(其实就是一台虚拟机)配置,系统版本是Windows server2008R2 Enterprise,64位,4G内存,E7-885 ...
- 【分块打表】bzoj3758 数数
验证一个数是不是优美的:设数位之和为sum,若sum mod 2 != 0,则不优美.否则考虑枚举这个数的每一位,将之前所有位任意相加产生的所有 数字和 和 当前位 的和塞到集合里,最终判断集合中是否 ...
- 将你的代码上传 Bintray 仓库(转)
转自:http://www.cnblogs.com/cpacm/p/5548241.html 在 Android Studio 中,我们通常可以利用 gradle 来导入别人写的第三方库,通常可以简单 ...