问题
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 的注释掉 运行的时候拿掉注释
注释。迁移完成之后在去掉注释。
说明
以上就是我在做项目中遇到的问题,以及解决办法,欢迎打击批评指正。