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 的注釋掉  運行的時候拿掉注釋

注釋。遷移完成之后在去掉注釋。

 

說明

 以上就是我在做項目中遇到的問題,以及解決辦法,歡迎打擊批評指正。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM