EF 6 code first - 从SQL server迁移到MySQL

最近鼓捣一个SaaS项目,后台用的是entity framework 6 code first +SQL server,需要把数据库迁移到MySQL,在这里记录一下遇到的问题。时间比较久了记得不是很准确,供参考。

1, 以前残留的Migration .cs文件(在项目的Migration目录里,包括Configuration.cs)要统统删除重新生成一遍,因为由SQL server connector生成的.cs文件与MySQL connector生成的.cs并不兼容。在nuget manager console里依次使用enable-migrations和add-migration <name>重新生成。

2,创建数据库的时候报异常The ADO.NET provider with invariant name 'MySql.Data.MySqlClient' is either not registered in the machine or application config file, or could not be loaded. See the inner exception for details."(或者是一个别的异常?记得不是很清楚),一番度娘之后发现要在DbContext的子类上添加以下:

[DbConfigurationType(typeof(MySqlEFConfiguration))]

3,再次创建数据库,又有异常Specified key was too long; max key length is 767 bytes,再一番度娘之后发现要在Configuration.cs文件里增加如下代码:

SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator());

4,前进到建表的SQL语句,发现Procedure是MySQL的SQL语句的关键字,需要用`作为escape字符,而在SQL server里用的是[].

 _helper.ExecuteCommand("INSERT INTO DBUpdateProcedure SET `Procedure` = @p0");

5,开始迁移stored procedure。SQL server创建stored procedure是在migration cs文件里手动调用this.CreateStoredProcedure()实现的,但是MySQL创建stored procedure有一个很特殊的语法,需要先将DELIMETER设为别的东西(比如“//”),再结束的时候再设回来。这个东西通过Migration cs文件没法实现,即使通过this.SQL()方法也不行,EF貌似不能正确的理解DELIMETER语法。所以只能在别的地方创建一个MySQLScript对象,通过设定它的Delimeter属性来达到同样的效果。

                sqlConn.Open();MySqlScript script_add_sp = new MySqlScript(sqlConn);StringBuilder sql = new StringBuilder();sql.Append(@"...");script_add_sp.Query = sql.ToString();script_add_sp.Delimiter = "//";script_add_sp.Execute();script_add_sp.Delimiter = ";";

 

6,stored procedure迁移好了,在调用的时候又报异常Only MySqlParameter objects may be stored。原因是有如下代码:

            var tenantIdParam = new SqlParameter("TenantId", tenantId);var officeIdParam = new SqlParameter("OfficeId", officeId);var searchTextParam = new SqlParameter("SearchText", searchText ?? "");var pageIndexParam = new SqlParameter("PageIndex", pageIndex);var pageSizeParam = new SqlParameter("PageSize", pageSize);var orderFieldParam = new SqlParameter("OrderField", orderField);var patients = DataContext.Database.SqlQuery<PatientPageResult>("csp_SearchPatient(@TenantId, @OfficeId, @SearchText, @PageIndex, @PageSize, @OrderField)",tenantIdParam, officeIdParam, searchTextParam, pageIndexParam, pageSizeParam, orderFieldParam).ToList();

这里我们必须构建MySqlParameter对象,而不是SQLParameter对象。并且MySql调用stored procedure要显示的加CALL关键字,所以改正之后的代码为:

            var tenantIdParam = new MySqlParameter("TenantId", tenantId);var officeIdParam = new MySqlParameter("OfficeId", officeId);var searchTextParam = new MySqlParameter("SearchText", searchText ?? "");var pageIndexParam = new MySqlParameter("PageIndex", pageIndex);var pageSizeParam = new MySqlParameter("PageSize", pageSize);var orderFieldParam = new MySqlParameter("OrderField", orderField);var patients = DataContext.Database.SqlQuery<PatientPageResult>("CALL csp_SearchPatient(@TenantId, @OfficeId, @SearchText, @PageIndex, @PageSize, @OrderField)",tenantIdParam, officeIdParam, searchTextParam, pageIndexParam, pageSizeParam, orderFieldParam).ToList();

7,在Linq语句区数据转化为对象的时候,报异常:System.FormatException occurred, Message=String was not recognized as a valid Boolean.貌似因为实体类上有boolean属性,MySQL connector生成的默认migration cs文件把这个属性存在类型为tinyint的列里,但读出来的时候又不知道怎么把0/1转换为true/false,所以抛了这个异常。这个问题作为MySQL connector的一个bug报在了这里。就在快要绝望的时候,发现了stack overflow上牛人提的解决方案(原文),方法就是在modelbuilder里指定将boolean类型用bit列存储,没太明白,先记录下来。

 modelBuilder.Properties().Where(x => x.PropertyType == typeof(bool)).Configure(x => x.HasColumnType("bit"));

 

这只是个开始,后面的坑再开新的随笔记录。

 

转载于:https://www.cnblogs.com/KennethYip/p/4747914.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

一&#xff1a;移植Boa(web服务器)到嵌入式Linux系统 一、Boa程序的移植 1、下载Boa源码 下载地址: http://www.boa.org/ 目前最新发行版本&#xff1a; 0.94.13 &#xff08;几年没更新版本了&#xff09; 下载 boa-0.94.13.tar.gz&#xff0c; 注意&#xff…

单元测试工具Numega BoundsChecker

From: http://blog.csdn.net/wangweitingaabbcc/article/details/7794985 1 前言 我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。 NuMega是一个动态测试工具&#xff0c;主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuM…

Qt split字符串分割

1、需求 从指定格式的时间字符串中提取关键参数。 2、实现 调用字符串的split方法 QString text "12:14:35"; QStringList list text.split(":");int hour list[0].toInt(); int min list[1].toInt(); int sec list[2].toInt();

在Codeigniter框架中使用NuSOAP

0、NuSOAP的简介 NuSOAP 是一组功能强大的PHP类&#xff0c;这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写&#xff0c;可以无缝的与许多最流行的SOAP服务实现交互&#xff0c;它以LGPL协议进行发布。NuSOAP的主要特性包括&#xff1a; 简单&a…

[react] 你有使用过loadable组件吗?它帮我们解决了什么问题?

[react] 你有使用过loadable组件吗&#xff1f;它帮我们解决了什么问题&#xff1f; 目前有两个 react-loadable和 loadable component&#xff0c;用于代码分割&#xff0c;解决打包体积过大的问题 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

JAVA运行程序代码段

我记得那时候刚毕业。学习JAVA恐惧是这里&#xff0c;它是关于JAVA称号。我总是不正确。如今&#xff0c;这最后审查。看了好半天。得赶紧把刚才学习到的那点东西记下来。 一、关于static的代码段运行顺序 运行结果例如以下&#xff1a; Inside main() Mug(1) Mug(2) c1 & …

Keil使用PC-Lint

Keil使用PC-Lint 随着项目的推进与迭代&#xff0c;一个Project的代码量往往会不知不觉增长&#xff0c;当项目代码达到数万行&#xff0c;迭代经历较长时间后&#xff0c;仅靠开发人员自身的代码质量已不能满足对整体质量的把控。难以避免会出现一些潜在的逻辑错误与非逻辑错误…

我的网页设计(网页页面制作二)

嵌入网页页面制作出自个人的爱好&#xff0c;利用代码的编写融入产生web网页页面的应用效果&#xff0c;来进行页面的选择、搜索。这样可以大大的提高了参考者、浏览者的个人不同需要&#xff0c;从而也了解了对网页页面制作扩大范围和空间。也可以转换对网页页面字体产生文字体…

警告warning: strncpy specified bound XX equals destination size

1、问题 用strncpy字符串拷贝时&#xff0c;出现警告&#xff1a;warning: strncpy specified bound 32 equals destination size [-Wstringop-truncation]。 2、解决&#xff1a;strncpy不拷贝最后一个字节&#xff0c;手动给它赋值\0。 例子&#xff1a; #define SIZE 20…

ShellExecute 函数的用法和实例

From: http://blog.sina.com.cn/s/blog_49364213010003d8.html 今天帮同学做毕业设计时&#xff0c;用到了ShellExecute 函数&#xff0c;在这写一下。关于ShellExecute函数&#xff1a;在ShellAPI单元中&#xff0c;ShellExecute函数的定义为&#xff1a;HINSTANCE ShellExec…

[React]你有用过哪些React的表单库吗?说说它们的优缺点

[React]你有用过哪些React的表单库吗&#xff1f;说说它们的优缺点 redux-formreact-jsonschema-formformikunform 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题…

嵌入式产品开发流程

嵌入式产品&#xff0c;与普通电子产品一样&#xff0c;开发过程都需要遵循一些基本的流程&#xff0c;都是一个从需求分析到总体设计&#xff0c;详细设计到最后产品完成的过程。但是&#xff0c;与普通电子产品相比&#xff0c;嵌入式产品的开发流程又有其特殊之处。它包含嵌…

Codeforces 478B 6thweek contest_B

Random teams 题意&#xff1a; 有n个选手和m个队伍&#xff0c;让你分配&#xff0c;条件是每个队伍至少要有1个选手。分配完之后&#xff0c;每队伍里2个人可以组成一组&#xff0c;求分配完之后最多的组数和最少的组数 分析&#xff1a; 1. 最多的情况就是&#xff0c;先每…

apache代理IIS的80端口实现共存

IIS与apache共用80端口方法&#xff1a; 一&#xff1a;如何有多的公网IP。可在一个网卡上绑定多个IP来实现。 IIS6&#xff0c;多IP下共存&#xff0c;IIS为192.168.0.1&#xff0c;apache为192.168.0.2 原文地址到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe…

[react] 你有使用过formik库吗?说说它的优缺点

[react] 你有使用过formik库吗&#xff1f;说说它的优缺点 Formik提供了便捷的表单操作&#xff0c; 如获取表单数据&#xff0c;表单校验&#xff0c;提交事件等 结合yup来设置表单校验规则非常方便 Formik is a small library that helps you with the 3 most annoying par…

Linux 多线程开发-线程创建pthread_creat

1、函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg); pid&#xff1a;返回创建成功后的线程ID&#xff0c;unsigned int型变量&#xff1b;attr&#xff1a;设置线程属性&#xff0c;为NULL则为默认属性&…

Eclipse的maven插件最新地址

最新地址&#xff1a;http://download.eclipse.org/technology/m2e/releases 原先&#xff1a;http://m2eclipse.sonatype.org/sites/m2e转载于:https://www.cnblogs.com/binarysheep/p/4752793.html

USB大全

http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

[react] 怎样动态导入组件?

[react] 怎样动态导入组件&#xff1f; 自己使用 import 和 async/await 实现的异步组件React.lazy开源库 react-loadable 库/react-lazyload 库babel 动态导入&#xff08;Dynamic Import&#xff09; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

/dev/fb0入门练习

From: http://sunnyshineboy.blog.163.com/blog/static/20281511820124121118700/ 大家都知道Unix/Linux系统是由命令驱动的。那么最基本的系统是命令行的&#xff08;就是想DOS一样的界面&#xff09;。X&#xff0d;Window&#xff0d;System是Unix/Linux上的图形系统&…