Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended
问题
1.在使用EntityFramework访问Mysql的时候,使用迁移来生成数据库或者更新数据库时候会遇到一些问题
2.EntityFramework.Extended对Mysql的支持不是很完全,其中修改是无法直接使用的需要做一些处理
3.EntityFramework.Extended如何跟EntityFramework其他的操作在一个事物里面(针对网友zengfanlin 问题)
解决方案
1.首先解决第一个问题
准备条件:用Nuget下载Mysql.Data.Entity(可以将依赖连同下载)

我们采用Code First的形式来建立了实体。然后新建自己的DbContext类。

这个直接使用命令
Enable-Migrations -ProjectName MedicalInsurance.Domain
Update-DataBase -ProjectName MedicalInsurance.Domain

来生成Migration文件

修改Configuration代码如下:
public Configuration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
}
在使用如下命令来迁移生成数据库(执行命令的时候一定要选择dbcontext所在的项目)
Add-Migration init
Update-DataBase -ProjectName MedicalInsurance.Domain
发现出现问题问题

修改DbContext文件

在dbcontext加上如图的特性
在执行 Add-Migration init

这个时候已经执行成功并且生成了相应的迁移文件
再来执行 Update-DataBase -ProjectName MedicalInsurance.Domain 将迁移更新到数据库中


如果你要修改实体的字段,或者增加实体的字段,或者增加实体,修改完成之后
再次执行
Add-Migration updatedb
Update-DataBase -ProjectName Alien.ClinicSystem.Data
这样就可以同步更新到数据库。(在此就不做详细的步骤了)
2.现在来解决第二个问题
准备条件:用Nuget下载EntityFramework.Extended

关于EntityFramework.Extended 的具体使用 请自行是搜索。在这里我只说明Update遇到的问题以及解决办法。
我们先来执行一下Update操作看看有什么问题。在这里我随便建个个Controller来测试Update(因为我这个项目是mvc的项目)。
我在数据库手动加了条数据:

现在我们来修改这条数据(将编号为1 的用户电话修改成“88888888”)

执行开看下效果:

出现以上错误,大概意思就是生成的sql语句不对。
如何解决呢。
使用以下方式完美的解决。
首先在DbContext类中修改代码(红色标注):
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class ClinicSystemContext : DbContext
{
public ClinicSystemContext() : base("mysqldb")
{
Database.SetInitializer<ClinicSystemContext>(null);
} public DbSet<User> Users { set; get; } public DbSet<Charge> Charges { set; get; } public DbSet<ChargeItem> ChargeItems { set; get; } public DbSet<Clinic> Clinics { set; get; } public DbSet<Diagnos> Diagnoses { set; get; } public DbSet<Disease> Diseases { set; get; } public DbSet<Drug> Drugs { set; get; } public DbSet<MaterialInfo> MaterialInfos { set; get; } public DbSet<Recipe> Recipes { set; get; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema(""); //增加配置 migration 的注释掉 运行的时候拿掉注释
base.OnModelCreating(modelBuilder);
}
}
然后在项目的启动的入口增加如下代码(我这是mvc的项目所以在Application_Start中加):

此时再来执行看看能不能修改。

没有报错。看下数据库内容有没有修改。

发现数据库的内容已经修改
3.上面第三个问题是网友zengfanlin 提出的。在此给出我的解决方案。
在ef中开启事物,即可解决此问题代码如下
using (ClinicSystemContext db = new ClinicSystemContext())
{
using (var tran = db.Database.BeginTransaction())
{
try
{
User user = new Domain.User
{
UserName = "ddd",
CreatedDate = DateTime.Now,
ModifyDate = DateTime.Now,
CreatorId = ,
Password = "",
Role = Domain.Enum.Role.Doctor,
Phone = ""
};
db.Users.Add(user);
db.SaveChanges();
int ret = db.Users.Where(x => x.Id == ).Update(x => new User { Phone = "" });
tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw;
}
} }
亲自测试只有tran.Commit();之后Update才会更新 到数据库,如果抛出异常,tran.Rollbak();则update同样不更新到数据库。
注意:
在使用ef.Extened时候,在修改实体,需要迁移数据库的时候,需要想将DbContext里面的
modelBuilder.HasDefaultSchema(""); //增加配置 migration 的注释掉 运行的时候拿掉注释
注释。迁移完成之后在去掉注释。
说明
以上就是我在做项目中遇到的问题,以及解决办法,欢迎打击批评指正。
Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended的更多相关文章
- Entity Framework数据库迁移
1.启用数据迁移: enable-Migrations2.增加一条数据库迁移指令:add-Migrations 必须带上一个版本名称,比如AddUsernamePassword完整的指令:add-Mi ...
- Entity Framework 数据库初始化四种策略
策略一:数据库不存在时重新创建数据库 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testC ...
- Entity Framework数据库初始化四种策略
策略一:数据库不存在时重新创建数据库 程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists< ...
- Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源
熟悉Entity Framework应该对以下图片不陌生,他就是ADO.NET实体数据模型向导:可以将数据库的表自动生成模型类,或者创建Code First的模型文件. 但是这个模型向导默认只显示微软 ...
- PostgreSQL Entity Framework 自动迁移
1.依次添加NuGet包 EntityFramework.Npgsql.EntityFramework6.Npgsql,会自动生成一些配置文件,不过缺少数据库驱动的配置节点: <system.d ...
- Entity Framework 数据库先行、模型先行、代码先行
数据库先行(Database First):基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件. 模型先 ...
- 手动写Entity Framework 数据库上下文和Model实体
1.引用EF对应的程序集 使用命令安装EntityFramework包Install-Package EntityFramework Entity Framework简单目录: 1.context数据 ...
- (摘)Entity Framework Core 2.1带来更好的SQL语句生成方案
微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Cor ...
- ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除
我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...
随机推荐
- JavaScript中知而不全的this
都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言.它把 函数式编程和 面向对象编程糅合一起,再加上 动态语言特性,简直强大无比(其实是不能和C++比的,^_^ ). 这 ...
- 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory
转载http://m.blog.csdn.net/blog/SpbDev/8545372 学习Spring的过程中,一直不理解为何配置的bean的class是LocalSessionFacto ...
- ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块
分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...
- shell parameter expansitions
type testtype -a test math calculate:echo $((1+2*3)) parameter expansition:bash-4 introduced feature ...
- AngularJS笔记---作用域和控制器
什么是作用域. 什么是控制器, 作用域包含了渲染视图时所需的功能和数据,它是所有视图的唯一源头.可以将作用域理解成试图模型(ViewModel). 作用域之间可以是包含关系也可以是独立关系.可以通过设 ...
- 第26章 java进制操作
java进制操作 1.二进制 二进制只有0和1,逢二进一 二进制多用在计算机中,来自计算机硬件的开关闭合 2.位运算 分别讲解: 2.1.按位与 & 两位全为1,结果才为1 0&0=0 ...
- Linux 进程间通讯详解三
msgctl()函数 int msgctl(int msqid, int cmd, struct msqid_ds *buf); --参数 msqid:有msgget函数返回的消息队列标识码 cmd: ...
- C#进阶系列——DDD领域驱动设计初探(七):Web层的搭建
前言:好久没更新博客了,每天被该死的业务缠身,今天正好一个模块完成了,继续来完善我们的代码.之前的六篇完成了领域层.应用层.以及基础结构层的部分代码,这篇打算搭建下UI层的代码. DDD领域驱动设计初 ...
- C#的前世今生,学会C#还能找到高薪工作吗?
其实C#,.net正在逐步淡出程序员的视野是正在发生的现实,量子及量子的小伙伴们,还在坚持写C#代码的人几乎没有了,回忆起过去那些写C#时候的美好时光,真是不胜唏嘘,最近园子里的一篇<C#程序员 ...
- CSS基本知识4-CSS行模型
display:inline.block.inline-block block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 i ...