mysql该如何entityframework数据库迁移和如何更好的支持entityframework.extended

Lenny Lenny     2022-08-02     444

关键词:

问题

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 的注释掉  运行的时候拿掉注释

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

 

说明

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

 

 

 

如何使用 EntityFramework 调用存储过程?

】如何使用EntityFramework调用存储过程?【英文标题】:HowtocallStoredProcedureswithEntityFramework?【发布时间】:2012-12-2505:50:33【问题描述】:我从MySQL数据库生成了一个EF4模型,并包含了StoredProcedures和Tables。我知道如何对EF进行常规的... 查看详情

谈entityframework数据更新之技巧(代码片段)

EntityFramework是一个很不错的ORM框架,一直都在使用。今天想跟大家分享以下EntityFramework数据更新方面的几个技巧: 1:如何new一个新实体去更新记录,而不是从数据库中查询一条记录来更新。 2:如何在更新实体的同时,... 查看详情

[ef]数据上下文该如何实例化?

...ate有不同。这里将查找的例子,在这里列举一下。资料在EntityFramework6中管理DbContext的正确方式——1考虑的关键点(外文翻译)在EntityFramework6中管理DbContext的正确方式——2Db 查看详情

MySql.EntityFramework 找不到合适的构造函数

】MySql.EntityFramework找不到合适的构造函数【英文标题】:MySql.EntityFrameworkasuitableconstructorcouldnotbelocated【发布时间】:2022-01-1114:51:14【问题描述】:这是我第一次尝试使用EntityFramework对DB进行操作。我的数据库是在MySQL中设置的,... 查看详情

使用Entity Framework和MySql生成数据库时如何制作Camel案例表名

】使用EntityFramework和MySql生成数据库时如何制作Camel案例表名【英文标题】:HowtomakeCamelcasetablenameswhengeneratingdatabaseusingEntityFrameworkandMySql【发布时间】:2021-10-1421:19:54【问题描述】:所以我在我的项目中使用ASP.NETCore5、MySql和Entity... 查看详情

EntityFramework 6 Alpha 2 & MySQL 连接器/NET 6.6.4

】EntityFramework6Alpha2&MySQL连接器/NET6.6.4【英文标题】:EntityFramework6Alpha2&MySQLConnector/NET6.6.4【发布时间】:2012-12-3014:37:49【问题描述】:6.6.4MySQL.NET连接器显然支持EF6。我已从EF5和.NET4升级到EF6alpha2和.NET4.5。升级后我重新创建... 查看详情

如何将 MySQL 与 .NET Core 3 和 Entity Framework 6 集成

】如何将MySQL与.NETCore3和EntityFramework6集成【英文标题】:HowtointegrateMySQLwith.NETCore3andEntityFramework6【发布时间】:2020-02-1201:13:23【问题描述】:我有一个完整的数据库项目.NETFramework,Entityframework6.3和MySql.Data.MySqlClient作为提供者(... 查看详情

如何在 EntityFramework 中按动态列名排序? [复制]

】如何在EntityFramework中按动态列名排序?[复制]【英文标题】:howtoorderbyadynamiccolumnnameinEntityFramework?[duplicate]【发布时间】:2016-10-2912:54:33【问题描述】:我正在尝试使以下代码正常工作,这对MSSQL来说工作正常,但由于我改用myS... 查看详情

如何向使用该程序的人隐藏 MySQL 数据库的密码

】如何向使用该程序的人隐藏MySQL数据库的密码【英文标题】:HowtohidepasswordtoMySQLdatabasefrompeopleusingtheprogram【发布时间】:2012-07-0801:02:54【问题描述】:我用JDBC创建了一个java程序,它成功地连接到我的计算机服务器的MySQL数据库... 查看详情

在我的情况下,我该如何设置 Silverlight 到 MySQL 的数据管道?

】在我的情况下,我该如何设置Silverlight到MySQL的数据管道?【英文标题】:HowmightIsetupdataplumbingforSilverlighttoMySQLinmysituation?【发布时间】:2009-11-2414:55:07【问题描述】:简而言之:设置从Silverlight到MySQL数据库的只读数据访问的好... 查看详情

如何在 ASP.NET 5 中将 Entity Framework 6 与 MySQL 一起使用?

】如何在ASP.NET5中将EntityFramework6与MySQL一起使用?【英文标题】:HowdoIuseEntityFramework6withMySQLinASP.NET5?【发布时间】:2015-10-2409:34:55【问题描述】:我有一个使用ASP.NETMVC4、EntityFramework6和MySQL的现有站点。我正在尝试将其升级到ASP.N... 查看详情

如何读取真正大的 JSON 文件并使用 node.js 将该文件的数据插入 MYSQL 数据库?

】如何读取真正大的JSON文件并使用node.js将该文件的数据插入MYSQL数据库?【英文标题】:HowtoreadreallyLARGEJSONfileandinsertthatfile\'sdataintoaMYSQLdatabaseusingnode.js?【发布时间】:2020-06-2206:53:53【问题描述】:我有很大的JSON文件(22GB)。... 查看详情

数据经labview写入mysql时出现以下错误,该如何解决???????

ADOConnectionOpen.vi->数据经LabVIEW写入数据库.vi中的ExceptionoccuredinMicrosoftOLEDBProviderforODBCDrivers:[Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序数据经LabVIEW写入MySQL参考技术A没有安装MYSQL的驱动吧?有个MYSQLCo... 查看详情

如何在 JSP 中插入数据后创建表并通过 java 将该数据保存到 mysql

】如何在JSP中插入数据后创建表并通过java将该数据保存到mysql【英文标题】:HowtocreateatableafterinsertingdatainJSPandalsosavethatdatatomysqlthroughjava【发布时间】:2018-07-1504:47:24【问题描述】:我已经建立了一个jsp页面,我从用户那里获取... 查看详情

您如何使用 discord.js mysql 检查该 ID 的数据是不是已存在

】您如何使用discord.jsmysql检查该ID的数据是不是已存在【英文标题】:Howdoyoucheckifdataalreadyexistofthatidwithdiscord.jsmysql您如何使用discord.jsmysql检查该ID的数据是否已存在【发布时间】:2020-08-0621:53:17【问题描述】:所以我尝试使用适... 查看详情

到底该如何实现一个数据库?

how-databases-workhttp://coding-geek.com/how-databases-work/ MySQL索引背后的数据结构及算法原理http://blog.codinglabs.org/articles/theory-of-mysql-index.html MySQL索引与IndexConditionPushdownhttp://blog.codin 查看详情

EntityFramework Core Database.EnsureCreated 不创建数据库

】EntityFrameworkCoreDatabase.EnsureCreated不创建数据库【英文标题】:EntityFrameworkCoreDatabase.EnsureCreateddoesn\'tcreatedatabase【发布时间】:2017-07-1318:45:29【问题描述】:我创建了一个带有dotnetcore和实体框架核心的项目。我使用MySql数据库,... 查看详情

如何在实体框架和 Mysql 中使用规范函数

...Mysql中使用规范函数【英文标题】:howtousecanonicalfunctionsinEntityFrameworkandMysql【发布时间】:2015-07-2522:47:38【问题描述】:我想使用MySql数据库在EntityFramework中将时间跨度添加到DateTime。我尝试过使用DbFunctions.AddMinutes(someminutes)和Enti... 查看详情