1. 程式人生 > >asp.net mvc entityframework sql server 遷移至 mysql方法以及遇到的問題

asp.net mvc entityframework sql server 遷移至 mysql方法以及遇到的問題

背景:

  我原來的專案是asp.net mvc5 + entityframework 6.4 for sql server(localdb,sql server),現在需要把資料庫切換成mysql,理論上entityframework是可以完全做到無縫切換,畢竟ORM的設計就是為了相容不同的底層資料庫。

步驟:

  1. 下載 mysql-connector-net-8.0.20.msi 並安裝(其實沒有什麼必要,可以直接從nuget下安裝)
  2. nuget 安裝 MySql.Data.EntityFramework,MySql.Data,注意:MySql.Data.Entity 和 MySql.Data.EntityFramework 應該只要一個就好了,我就安裝 MySql.Data.EntityFramewor
  3. 配置webconfig
     1 <connectionStrings>
     2     <remove name="DefaultConnection"/>
     3     <!--使用scaffold生成controller 時要先登出以下配置-->
     4     <add name="DefaultConnection" connectionString="server=localhost;port=3306;database=webapp;uid=root;password=root;Persist Security Info=True" providerName="MySql.Data.MySqlClient" />
     5     <!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB; Initial Catalog=webappv4;Integrated Security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />-->
     6   </connectionStrings>
     7 <!--<entityFramework >
     8     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
     9     <providers>
    10       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    11     </providers>
    12   </entityFramework>-->
    13   <!--使用scaffold生成controller 時要先登出以下配置-->
    14   <entityFramework codeConfigurationType="MySql.Data.EntityFramework.MySqlEFConfiguration, MySql.Data.EntityFramework">
    15     <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    16       <parameters>
    17         <parameter value="mssqllocaldb" />
    18       </parameters>
    19     </defaultConnectionFactory>
    20     <providers>
    21       <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    22       <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.EntityFramework, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    23 
    24     </providers>
    25   </entityFramework>
    26   <system.data>
    27     <DbProviderFactories>
    28       <remove invariant="MySql.Data.MySqlClient" />
    29       <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=8.0.20.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    30     </DbProviderFactories>
    31   </system.data>
    web.config

    修改dbcontext

     1 // 使用scaffold生成controller 時要先登出以下配置
     2   [DbConfigurationType(typeof(MySqlEFConfiguration))]
     3   public class StoreContext : DbContext
     4   {
     5 
     6 
     7    public StoreContext()
     8         : base("name=DefaultConnection") {
     9       //獲取登入使用者資訊,tenantid
    10       //QueryFilterManager.AllowPropertyFilter = true;
    11       //var claimsidentity = (ClaimsIdentity)HttpContext.Current.User?.Identity;
    12       //var tenantclaim = claimsidentity?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid");
    13       //var tenantid = Convert.ToInt32(tenantclaim?.Value);
    14       //設定當對Work物件進行查詢時預設新增過濾條件
    15       //QueryDbSetFilterManager.Filter<Work>(q => q.Where(x => x.TenantId == tenantid));
    16       //this.Filter<Work>(q => q.Where(x => x.TenantId == tenantid));
    17       //設定當對Order物件進行查詢時預設新增過濾條件
    18       //QueryDbSetFilterManager.Filter<Order>(q => q.Where(x => x.TenantId == tenantid));
    19       //this.Filter<Order>(q => q.Where(x => x.TenantId == tenantid));
    20       //QueryDbSetFilterManager.InitilizeGlobalFilter(this);
    21 
    22     }
    23 }
    dbcontext.cs
  4. 執行遷移命令,重新建立資料庫表名
    1 //執行命令前先刪除專案Migrations下的檔案
    2 enable-migrations 
    3 add-migration md_init
    pm>
  5. 修改 dbcontext 
     1 protected override void OnModelCreating(DbModelBuilder modelBuilder)
     2     {
     3       //Oracle 表所有者,(SQL 改成 dbo(預設),也可刪除此設定)
     4       modelBuilder.HasDefaultSchema(string.Empty);
     5       //預設把string型別轉換成nvarchar,原本nlogtext
     6       modelBuilder.Properties<string>().Configure(c => c.IsUnicode(false));
     7       base.OnModelCreating(modelBuilder);
     8      
     9 
    10     }
    View Code

     

測試

  通常情況做完這些修改就可以執行起來了。

遇到的問題

 

 再使用scaffold生成controller的時候會報錯,這樣的錯誤網上一搜一堆,但所有的解決方法我都試了,不行。無解,問題應該是mysql.data.entityframework的問題我用vs.net 2019,暫時沒有在其它低版本下試過。

目前我的解決方法是,通過修改web.config,在需要用scaffold生成controller的時候把涉及到mysql entityframework的配置全部還原成sql server的配置,等生成成功了,在把配置改回到mysql.

我不知道你們有沒有遇到這樣的問題,有完美解決的解決方案嗎。如果知道的請留言,不甚感激

 

 

 

&nb