ef mysql codefirst_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 Students { get; set; }

public int MaxNumber { get; set; }

}

在控制台一次执行Enable-Migrations、Add-Migration newModel、update-database -v,如此可得到一个数据库实例。

现在需求改变了,Class类型中不要Students了,现在把Students属性注释掉。

再次执行命令:add-migration removeStudents、 update-database,结果如下所示:

ef mysql codefirst_EF6(CodeFirst)+MySql开发遇到的坑_第1张图片

其报错”Table’codefirstdemodb.dbo.students’doesn’t exist”,codefirstdemodb.dbo是什么鬼东西?

1、codefirstdemodb是我们在配置文件中配置的数据库实例名称。

2、dbo是codeFirst默认的架构名称。

而在mysql数据库中的默认的架构(Schema)却是codefirstdemodb。

ef mysql codefirst_EF6(CodeFirst)+MySql开发遇到的坑_第2张图片

那么答案就很明显了,codefirstdemodb.dbo.students当然找不到了。在mysql中的Schema就是数据库实例的名称,然而在CodeFirst框架中默认的架构(Schema)名称是dbo。

此时问题已经找到了,那么如何解决呢?方法有二:

1、修改CodeFirst框架的默认架构。

2、修改迁移文件自动生成的代码中的架构名。

关于方法1,我已经尝试了多种途径,但无一生效,我觉得应该是兼容性问题,如果有大能解决了,还望赐教。

方法2就很简单了,因为数据库中表名是不重复的,所以直接是用表名就能找到,把架构名称删除就好。

打开迁移自动生成的代码:

ef mysql codefirst_EF6(CodeFirst)+MySql开发遇到的坑_第3张图片

直接替换

ef mysql codefirst_EF6(CodeFirst)+MySql开发遇到的坑_第4张图片

如下图所示:

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(

IDatabaseInitializer strategy

)

where TContext : DbContext

例如在EF上下文的构造函数中调用该API。

Database.SetInitializer(null);

如此就可以满足我们的需求了,解藕了EF实体类型和数据库的耦合。

那么这就会引发另一个问题,我们改动EF实体模型之后,以前是可以自动迁移的,现在数据库已经和EF实体类型不是一一对应的关系了,如果自动迁移的话,有可能出现意料之外的改动。

这时候,我们就可以通过Update-DataBase -script生成sql脚本,然后检查,最后把准确无误的sql脚本直接在数据库中执行。

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主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

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肯定支持,结果,使用过程中很多坑,现在我把具体的配 ...

随机推荐

ansible定时任务模块和用户组模块使用

接上篇,还是一些基础模块的使用,这里主要介绍的是系统模块的使用. 下面例子都进行过相关的实践,从而可以直接进行使用相关的命令. 3.用户模块的使用 用户模块主要用来管理用户账号和用户的属性(对远程主机 ...

TreeView节点拖拉操作1

TreeView节点拖拉操作1 //事先设置 TreeView1.DragMode= dmAutomatic;   unit Unit1; interface uses   Windows, Me ...

SSO单点登录的实现原理

单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求.我将以我所 ...

常用iptables规则整理

1.仅允许内部合法的IP地址访问服务器 #setting access rules #one,in access rules,allow all the ips of hudong.com iptab ...

Android内置下拉刷新组件SwipeRefreshLayout

也许下拉刷新之前,你可能会使用一些第三方的开源库,例如PullToRefresh, ActionBar-PullToRefresh等待,但现在有的正式组成部分---SwipeRefreshLayout ...

【高德地图API】一句话搞定webmap(一)——轻地图组件

原文:[高德地图API]一句话搞定webmap(一)——轻地图组件 摘要: 遥想当年,在APP中加入LBS元素相当困难:要刻苦学习java,要刻苦学习iOS开发,要刻苦学习javascript…… 而 ...

lvs+keepalive实现主从效果,以及RS健康监测和tcp,udp实现非web的负载均衡

前面文章讲到了tcp和udp负载均衡,但是没有健康监测,这几天我优化了一下上次的操作.当然,我也是用的跨网段的通讯,因为线上业务主要是海外业务,所以做了iptables流量转发 IP: lvs-mas ...

Kali 局域网 DNS 劫持

所需工具  1: Kali-linux-2017  2: ettercap 0.8.2 3: web 服务器, 这里以 node 为例 原理  1: DNS劫持 ...

13 Reasons Why You Should Pay Attention to Mobile Web Performance

Mobile is no longer on the sidelines. If you’re not already thinking mobile first, you should at lea ...

异常笔记:运行hdfs copyFromLocal 上传文件报错

把本地文件系统,复制到dfs文件系统时报错的错 [hadoop@localhost ~]$ hdfs dfs -copyFromLocal /home/hadoop/mk.txt /xg_test/ ...

你可能感兴趣的:(ef,mysql,codefirst)