EF6(CodeFirst)+MySql开发遇到的坑
最近一不小心偷个懒就已经过了好几个月了,真是惭愧惭愧,出来混终究是要还的,我还是把”脱坑指南“写完吧,-_-~~。点我打开上篇博客
0x001、架构名”dbo”の殇
坑之首也,当提架构名,在mssqlServer中dbo是默认的架构,在codeFirst中默认的架构名就是dbo,举个栗子先。
新建一个工程(参照上篇文章),创建两个类型
public class Student
{
public int Id { get; set; }
[MaxLength()]
public string NickName { get; set; }
}
public class Class
{
public int Id { get; set; }
public virtual ICollection<Student> Students { get; set; }
public int MaxNumber { get; set; }
}
在控制台一次执行Enable-Migrations、Add-Migration newModel、update-database -v,如此可得到一个数据库实例。
现在需求改变了,Class类型中不要Students了,现在把Students属性注释掉。
再次执行命令:add-migration removeStudents、 update-database,结果如下所示:

其报错”Table’codefirstdemodb.dbo.students’doesn’t exist”,codefirstdemodb.dbo是什么鬼东西?
1、codefirstdemodb是我们在配置文件中配置的数据库实例名称。
2、dbo是codeFirst默认的架构名称。
而在mysql数据库中的默认的架构(Schema)却是codefirstdemodb。

那么答案就很明显了,codefirstdemodb.dbo.students当然找不到了。在mysql中的Schema就是数据库实例的名称,然而在CodeFirst框架中默认的架构(Schema)名称是dbo。
此时问题已经找到了,那么如何解决呢?方法有二:
1、修改CodeFirst框架的默认架构。
2、修改迁移文件自动生成的代码中的架构名。
关于方法1,我已经尝试了多种途径,但无一生效,我觉得应该是兼容性问题,如果有大能解决了,还望赐教。
方法2就很简单了,因为数据库中表名是不重复的,所以直接是用表名就能找到,把架构名称删除就好。
打开迁移自动生成的代码:

直接替换

如下图所示:
public override void Up()
{
DropForeignKey("Students", "Class_Id", "Classes");
DropIndex("Students", new[] { "Class_Id" });
DropColumn("Students", "Class_Id");
} public override void Down()
{
AddColumn("Students", "Class_Id", c => c.Int());
CreateIndex("Students", "Class_Id");
AddForeignKey("Students", "Class_Id", "Classes", "Id");
}
这样生成的sql语句就不再有架构名称了,再次执行update-database -v,就ok了。
0x002、
每次迁移都要和数据库中_MigrationHistory 中的数据比对,如果不一致就会报错,这就不符合我们的实用场景来。
我们希望实体类型只要在数据库中存在并且结构一致就可以正常访问。
那么如何实现呢?其实很简单,只要调用EF的一个API就可以设置了。
public static void SetInitializer<TContext>(
IDatabaseInitializer<TContext> strategy
)
where TContext : DbContext
例如在EF上下文的构造函数中调用该API。
Database.SetInitializer<MyDbContext>(null);
如此就可以满足我们的需求了,解藕了EF实体类型和数据库的耦合。
那么这就会引发另一个问题,我们改动EF实体模型之后,以前是可以自动迁移的,现在数据库已经和EF实体类型不是一一对应的关系了,如果自动迁移的话,有可能出现意料之外的改动。
这时候,我们就可以通过Update-DataBase -script生成sql脚本,然后检查,最后把准确无误的sql脚本直接在数据库中执行。
EF6(CodeFirst)+MySql开发遇到的坑的更多相关文章
- EF6(CodeFirst)+MySql开发脱坑指南
废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...
- CodeFirst+MySql开发
CodeFirst+MySql开发简单入门 记录一下使用Mysql进行EF Codefirst方式开发的简单过程. 0.准备工作 安装MySql,mysql-connector-net,mysql-f ...
- EF6 Codefirst+MySql 数据库迁移
简介 项目使用MSSql作为数据库,但是因为SQL服务器贵那么一点,并发连接差那么一点,要把数据迁移到MySQL,顺带迁移过程以及问题. 环境 Visual Studio 2013 MySQL 5.7 ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(一)
前言 本系列源自对EF6 CodeFirst的探索,但后来发现在自己项目中构建的时候遇到了一些问题以及一些解决方法,因此想作为一个系列写下来. 本系列并不是教你怎么做架构设计,但可以参照一下里面的方法 ...
- [转载] 根据多年经验整理的《互联网MySQL开发规范》
原文: http://weibo.com/p/2304181380b3f180102vsg5 根据多年经验整理的<互联网MySQL开发规范> 写在前面:无规矩不成方圆.对于刚加入互联网的朋 ...
- 【踩坑记录】记一次MySQL主从复制延迟的坑
最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...
- [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- VS2017 + EF6连接MySql
VS2017 + EF6连接MySql 原地址:https://blog.csdn.net/mzhifa/article/details/80999105 VS2017 + EF6连接MySql ...
- visual studio 2013 下ef6 CodeFirst 使用SQL Lite 数据库
今天系统的来记录一下再vs2013下,使用ef6 codefirst功能,来操作SQL lite数据库 本来我以为sqlite数据库用的这么多,ef6肯定支持,结果,使用过程中很多坑,现在我把具体的配 ...
随机推荐
- SikuliLibrary 库关键字注释
在 https://github.com/rainmanwy/robotframework-SikuliLibrary 看到rainmanwy 整理的SikuliLibrary库,非常适合工作需要, ...
- bash fifo管道使用测试例子
碰到一个场景: 一个脚本内起了多个后台线程,往一个日志文件写日志,结果因为线程之间争抢写锁,导致脚本执行效率很低,为了解决这个问题,希望减少写锁的争抢,尝试使用fifo解决该问题,以下是实验用例子. ...
- Linux下的虚拟Bridge实现
http://www.cnblogs.com/zmkeil/archive/2013/04/21/3034733.html Linux下的Bridge也是一种虚拟设备,这多少和vlan有点相似,它依赖 ...
- python json模块
import json dic = {"name":"liao","age":18} data = json.dumps(dic) #转化为 ...
- 一起买beta版UI测试
一起买beta版UI测试 测试目的 保证代码质量,对各个单元进行测试,可以有效地保证代码的可靠性,让模块在与别的模块整合时出现更少的错误. UI测试 登录模块测试 登录模拟过程. 发帖模块测试 ...
- C#之方法的重载与递归
(1). 方法的重载:方法的名称相同,但参数不同. 1.如果参数的个数相同,那么参数的类型不能相同. 2.如果参数的类型相同,那么参数的个数不能相同. (2).方法的递归:方法自己调用自己.用于找出一 ...
- mybatis中表与表之间的关联
第三天 1.mybatis处理表与表之间的关系? 比如要在帖子回复表里显示其它两张相关联表的信息. 处理的第一种方式: 1)主要的数据实体类是ReplyInfo,相关联的实体表的数据是TitleInf ...
- C# 基础(8)--网络编程
套接字,客户端连接服务器,作为进程通讯机制,是基于描述IP地址和端口,是一个通讯链的句柄,其实质就是两个程序通讯用的. 非常类似于电话插座.双方通话的过程,是一方向电话机发出信号和对方从电话机接受信号 ...
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/16330267 在上一篇文章中,我带着大家一起剖析了一下LayoutInflater ...
- 1.本周的作业请参照此文:http://www.ruanyifeng.com/blog/2015/12/git-workflow.html 制定本组项目的GitHub版本更新流程---答题者:徐潇瑞
首先,介绍一下gitflow,它是最早诞生.并得到广泛采用的一种工作流程.如果采用git flow开发流程,那么项目存在两个常设分支,一个叫主分支master,另一个叫开发分支develop.mast ...