問題
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 的注釋掉 運行的時候拿掉注釋
注釋。遷移完成之后在去掉注釋。
說明
以上就是我在做項目中遇到的問題,以及解決辦法,歡迎打擊批評指正。