zoukankan      html  css  js  c++  java
  • 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 = 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 的注释掉  运行的时候拿掉注释

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

    说明

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

     

  • 相关阅读:
    上传文件
    Python中@staticmethod和@classmethod的作用和区别
    面向对象 类
    成员修饰符
    class 类 笔记
    模块&包
    java 文件上传下载
    redis 基本操作命令
    redis 和 mysql 的主从复制
    mysql的日志文件及其作用
  • 原文地址:https://www.cnblogs.com/nele/p/5837159.html
Copyright © 2011-2022 走看看