问题

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代码如下:

  1. public Configuration()
  2. {
  3. AutomaticMigrationsEnabled = true;
  4. AutomaticMigrationDataLossAllowed = true;
  5. }

在使用如下命令来迁移生成数据库(执行命令的时候一定要选择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类中修改代码(红色标注):

  1. [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
  2. public class ClinicSystemContext : DbContext
  3. {
  4. public ClinicSystemContext() : base("mysqldb")
  5. {
  6. Database.SetInitializer<ClinicSystemContext>(null);
  7. }
  8.  
  9. public DbSet<User> Users { set; get; }
  10.  
  11. public DbSet<Charge> Charges { set; get; }
  12.  
  13. public DbSet<ChargeItem> ChargeItems { set; get; }
  14.  
  15. public DbSet<Clinic> Clinics { set; get; }
  16.  
  17. public DbSet<Diagnos> Diagnoses { set; get; }
  18.  
  19. public DbSet<Disease> Diseases { set; get; }
  20.  
  21. public DbSet<Drug> Drugs { set; get; }
  22.  
  23. public DbSet<MaterialInfo> MaterialInfos { set; get; }
  24.  
  25. public DbSet<Recipe> Recipes { set; get; }
  26.  
  27. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  28. {
  29. modelBuilder.HasDefaultSchema(""); //增加配置 migration 的注释掉 运行的时候拿掉注释
  30. base.OnModelCreating(modelBuilder);
  31. }
  32. }

然后在项目的启动的入口增加如下代码(我这是mvc的项目所以在Application_Start中加):

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

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

发现数据库的内容已经修改

3.上面第三个问题是网友zengfanlin 提出的。在此给出我的解决方案。

在ef中开启事物,即可解决此问题代码如下

  1. using (ClinicSystemContext db = new ClinicSystemContext())
  2. {
  3. using (var tran = db.Database.BeginTransaction())
  4. {
  5. try
  6. {
  7. User user = new Domain.User
  8. {
  9. UserName = "ddd",
  10. CreatedDate = DateTime.Now,
  11. ModifyDate = DateTime.Now,
  12. CreatorId = ,
  13. Password = "",
  14. Role = Domain.Enum.Role.Doctor,
  15. Phone = ""
  16. };
  17. db.Users.Add(user);
  18. db.SaveChanges();
  19. int ret = db.Users.Where(x => x.Id == ).Update(x => new User { Phone = "" });
  20. tran.Commit();
  21. }
  22. catch (Exception ex)
  23. {
  24. tran.Rollback();
  25. throw;
  26. }
  27. }
  28.  
  29. }

亲自测试只有tran.Commit();之后Update才会更新 到数据库,如果抛出异常,tran.Rollbak();则update同样不更新到数据库。

注意:

在使用ef.Extened时候,在修改实体,需要迁移数据库的时候,需要想将DbContext里面的

  1. modelBuilder.HasDefaultSchema(""); //增加配置 migration 的注释掉 运行的时候拿掉注释

注释。迁移完成之后在去掉注释。

说明

以上就是我在做项目中遇到的问题,以及解决办法,欢迎打击批评指正。

Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended的更多相关文章

  1. Entity Framework数据库迁移

    1.启用数据迁移: enable-Migrations2.增加一条数据库迁移指令:add-Migrations 必须带上一个版本名称,比如AddUsernamePassword完整的指令:add-Mi ...

  2. Entity Framework 数据库初始化四种策略

    策略一:数据库不存在时重新创建数据库 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testC ...

  3. Entity Framework数据库初始化四种策略

    策略一:数据库不存在时重新创建数据库 程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists< ...

  4. Visual Studio2017中如何让Entity Framework工具【ADO.NET实体数据模型】支持MYSQL数据源

    熟悉Entity Framework应该对以下图片不陌生,他就是ADO.NET实体数据模型向导:可以将数据库的表自动生成模型类,或者创建Code First的模型文件. 但是这个模型向导默认只显示微软 ...

  5. PostgreSQL Entity Framework 自动迁移

    1.依次添加NuGet包 EntityFramework.Npgsql.EntityFramework6.Npgsql,会自动生成一些配置文件,不过缺少数据库驱动的配置节点: <system.d ...

  6. Entity Framework 数据库先行、模型先行、代码先行

    数据库先行(Database First):基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件. 模型先 ...

  7. 手动写Entity Framework 数据库上下文和Model实体

    1.引用EF对应的程序集 使用命令安装EntityFramework包Install-Package EntityFramework Entity Framework简单目录: 1.context数据 ...

  8. (摘)Entity Framework Core 2.1带来更好的SQL语句生成方案

    微软发布了Entity Framework Core2.1,为EF开发者带来了很多期待已久的特性.EF Core 2.1增加了对SQL GROUP BY的支持,支持延迟加载和数据种子等. EF Cor ...

  9. ef和mysql使用(二)--让mysql支持EntityFramework.Extended实现批量更新和删除

    我们都知道Entity Framework 中不能同时更新多条记录,但是一个老外写的扩展库可以实现此功能EntityFramework.Extended,但是如何是mysql数据库要怎么实现呢 首先实 ...

随机推荐

  1. Oracle数据库穿越防火墙访问

    原因 Oracle listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后spawned一个新的数据库连接,这个连接端口由listener传递给客户机,此后客户 ...

  2. spark standalone ha spark submit

    when you build a spark standalone ha cluster, when you submit your app,  you should send it to the l ...

  3. 报表软件FineReport如何连接SAP HANA

    1. 环境搭建 1.1 环境准备 首先确认HANA Studio的环境是否允许工程进行NewFile的操作,不行的话要考虑更新Studio的版本. HANAStudio需要依赖Java jdk1.6或 ...

  4. 一个开关电源传导、辐射处理案例-----Layout环路

    这是一款输入宽电压120-277V  60HZ,输出48V,273mA的电源,使用美芯晟MT7933,采用Buck拓扑结构. 注:在最初的设计中,预留电感L1.L2,CBB电容C1.C2作为传导测试元 ...

  5. h3c防火墙的设置过程

    公司采购了一款h3c的防火墙,型号为F100-E-G,以前也设置过H3C的防火墙,不过这次还是设置还是有各种问题,所以把设置过程记录下来,方便以后查阅. 一.防火墙一般在0口都设置一个默认的IP地址1 ...

  6. 装13失败后的逆袭(ComboBox的联动)

    当我们在做ComboBox的联动的时候飞一般的敲出自认为完美的代码.在运行的时候突然变得不完美了. 比如: 如果发生了这种情况会不会就卡磁了呢 当然不会作为程序猿的我们考的是我们聪明的大脑,当然会想出 ...

  7. Java面向对象 第一章 面向对象开发方法概述

    一.软件开发经历的生命周期: ①软件分析 ②软件设计 ③软件编码 ④ 软件测试 ⑤ 软件部署 ⑥软件维护 二.为了提高软件开发效率,降低软件开发成本,一个优良的软件系统应该具备以下特点: ① 可重用性 ...

  8. 搭建一套自己实用的.net架构(4)【CodeBuilder-RazorEngine】

    工欲善其事必先利其器,  下面来说说代码生成器. 现在代码生成器品种繁多各式各样, 什么codesmith.T4. 动软也算.那么每款代码生成器都有自己模板解析引擎. 现在比较流行的 NVelocit ...

  9. tomcat7配置虚拟目录

    1.tomcat7的安装路径下,D:\Program Files\java\Tomcat 7.0\conf,修改server.xml文件,如图: 在</Host>标签前,添加上图选中部分即 ...

  10. ADC

    ADC转换分为两种通道组 1.规则通道组 2.注入通道组(可打断规则通道组) 工作模式 通道模式 转换模式 复位校准 AD校准