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肯定支持,结果,使用过程中很多坑,现在我把具体的配 ...
随机推荐
- 远程debug hadoop
- RHEL7学习之NTP配置
一,安装NTP [root@localhost ~]# yum install ntp Loaded plugins: product-id, subscription-manager This sy ...
- Mac下U盘安装系统“未验证的错误”
bash下 输入下面命令: date 1220141012015.30
- Http请求中Content-Type讲解以及在Spring MVC中的应用
引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值 ...
- Server.mappath用法
1.Server.MapPath ("/") 应用程序根目录所在的位置 如 C:\qq\qqroot\ 2.Server.MapPath ("./") 表示所在 ...
- html之间的传值
传值:window.location.href=“eidit.html?activityId=“+acytivityIDd: 将id放进地址栏传到另一html页面 接受 再用var str=wind ...
- hasOwnProperty和in
返回一个布尔值,指出一个对象是否具有指定名称的属性. hasOwnProperty 此方法无法检查该对象的原型链中是否具有该属in 可以检查原型链中是否具有该属
- python __call__内置函数
__call__实现可以直接调用对象的作用
- Java打jar包详细教学
如果我们需要将写好并测试OK的公共接口供多个项目使用,我们可以不用拷贝源代码,可以编译后打包成jar文件,这样会很方便许多,修改的话也方便,直接修改源代码打一个新jar包替换即可,下面是打包的详细教程 ...
- Python小练习四
# 使用给定的宽度打印格式化后的价格列表 width = (int)(input('Please enter width:')) price_width = 10 item_width = width ...