Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EF.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 = 1,
                            Password = "123456",
                            Role = Domain.Enum.Role.Doctor,
                            Phone = "6666666"
                        };
                        db.Users.Add(user);
                        db.SaveChanges();
                        int ret = db.Users.Where(x => x.Id == 1).Update(x => new User { Phone = "99999999" });
                        tran.Commit();
                    }
                    catch (Exception ex)
                    {
                        tran.Rollback();
                        throw;
                    }
                }


            }

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

注意:

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

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

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

说明

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

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-09-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Coding01

花 2 小时撸一个 RSS 生成器

现在越来越多的网站都不支持 RSS 订阅了,而作为 RSS 的忠实粉丝,还是希望有个工具可以将自己关注的网站内容聚合在一起,然后实时推送到手机上,及时获取最新消...

75020
来自专栏Golang语言社区

MySQL 读写分离

一 什么是读写分离 MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。基本的原理是让主数据库处理事务性查询...

1.1K60
来自专栏FreeBuf

深入解析新型加密货币挖矿恶意软件ZombieBoy

延续了2018年加密货币挖矿恶意软件的趋势,我发现了另一种类似于5月初发现的“MassMine”的挖矿恶意软件。我把这个家族称为ZombieBoy,因为它使用了...

13620
来自专栏WebApiClient

WebApiClient进阶

你应该尽量将得到的myWebApi保持为全局变量,多次请求里共用一个myWebApi实例。如果频繁地每次请求都创建和释放myWebApi,实际等同于短连接到服务...

42700
来自专栏恰童鞋骚年

.NET Core微服务之服务间的调用方式(REST and RPC)

  微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、by...

26760
来自专栏技术小站

Tomacat 开放远程调试端口配置(转)

方法1、  WIN系统,在catalina.bat里:  SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava....

18320
来自专栏PHP在线

重磅资料!Github上的PHP资源汇总大全

依赖管理 ——用于依赖管理的包和框架 Composer/Packagist : 一个包和依赖管理器 Composer Installers: 一个多框架Com...

32540
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (5)

之前的配置都是在内存中, 下面将如何把这些数据存储到Sql Server数据库, 这样更适合生产环境. 这部分基本完全参考官方文档: https://ident...

39750
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第十三天 基础加强-JDBC高级开发事务【悟空教程】

insert into account values (null,'jack',10000);

9220
来自专栏cloudskyme

hadoop 异常记录 ERROR: org.apache.hadoop.hbase.MasterNotRunningException: Retried 7 times

当我把hadoop、hbase安装配置(具体参考这里)好了之后,启动hbase的shell交互模式,输入命令却出现了下面这样的错误:  ERROR: org.a...

38060

扫码关注云+社区

领取腾讯云代金券