MVC4,MVC3,VS2012+ entity framework Migration from Sqlserver to Mysql


在開發的初期個人認為因VS與Sqlserver的配合很默契,即可以方便的實現Code First,又可以使用SqlServer Manager很漂亮的進行建模與變更,也許是個人的使用習慣MS的界面做的很好,似乎開源的產品美感上都追不上商用版。

所以個人比較喜歡的開發流程是初次開發以SqlServer Manager進行數據庫建模,初步建構業務邏輯;

其次使用Vs的Entity FrameWork 快速的建立起ROM;

最后當開發進行到一定程度時再進行數據庫遷移,把SqlServer 轉換為MySql。

一、環境:Win 8.1 + Vs2012 + MysqlServer 5.7 + WorkBench 6.0 CE 

注意事項:

1. 在某種怪異的情況下Win 8.1 + vs2012 +mysql 5.7 此種搭配是無法使用的,在StackOverFlow中也有很多碼友們,包括身邊的同事也都有遇到過類似問題,

現象是在Win8.1下安裝mysql5.7 時,mysql for vs2012 與 mysql connection net 5.7無法正常安裝,即使卸載Mysql也無用,自然在Vs2012中添加Ado.net entity model時未有Mysql conncetion集成到Vs中,但往往在Vs的SqlServer Explore中你可以添加Mysql,但不要試圖填寫conncetion string,因為那樣會讓您老人家Vs崩潰。

原因可能是Mysql 在配合MS的新家伙Win 8.1 系統時有Bug存在。

解決辦法:此種情況並非每次都會出現,但出現以后很難解決,如果哪位碼友知道請賜教;重裝系統或者自己運氣好,軟件自動修復了。

2.使用WorkBench可以很方便的進行數據庫遷移,很人性化,自動把SqlServer轉為MySql,但某些字段的轉換會失敗,需要手動修復了。

3.在Vs連接Mysql時不要使用Root,盡量配置以項目為區分的私有帳戶,這樣可以最大化的實現自定義,配置為允許遠程連接的即可。

4.在VS2012創建MySql的Ado.net entity framework時生成的實體全是小寫,會使原有建立在SqlServer實體化基礎上的代碼出現問題,木有關系,把原來的Copy過來即可,Simple.

 不過還有一個辦法就是使用DbLinq(https://code.google.com/p/dblinq2007/)來替代EF,但不建議使用在正規場合,學習可以,因為其最終版本是2007年,此后再無更新。

二、流程:

  數據庫遷移:直接使用WorkBench進行數據庫從SqlServer 遷移到MySql。

  代碼遷移:  

  1.  確保成功安裝Connector NET 6.7.4 與 MySQL for Visual Studio 1.0.2

  2.  創建MVC3 Web Application,添加引用從NuGet或者MySQL for Visual Studio 1.0.2中獲取最新版本的三個DLL:MySql.Data,MySql.Data.Entity,MySql.Web。

  3.  如果以上步驟OK的話,當向項目中添加Ado.net entity framework時,New Connection 就可以看到Mysql database選項,否則你就倒霉了,可以參考環境->注意事項;

  4.  修改Web.Config,需要增加及修改的示例代碼如下:

<connectionStrings>
    <add name="MySQLConnString"
         connectionString="Server=192.168.29.157;Port=3306;Database=**;Uid=**;Pwd=**;"
         providerName="MySql.Data.MySqlClient" />
    <add name="newsoftgatewayEntities"
         connectionString="metadata=res://*/NewsoftGateWay.csdl|res://*/NewsoftGateWay.ssdl|res://*/NewsoftGateWay.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=192.168.29.157;user id=**;password=**;database=newsoftgateway&quot;"
         providerName="System.Data.EntityClient" />
  </connectionStrings>
  <system.web>
<membership defaultProvider="MySqlMembershipProvider">
      <providers>
        <clear />
        <add name="MySqlMembershipProvider"
             type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.7.4,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
             connectionStringName="MySQLConnString" enablePasswordRetrieval="false" enablePasswordReset="true"
             requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0"
             passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" />
      </providers>
    </membership>
    <profile>
      <providers>
        <clear />
        <add name="MySQLProfileProvider"
             type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.7.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
             connectionStringName="MySQLConnString" applicationName="/" />
      </providers>
    </profile>
    <roleManager enabled="true" defaultProvider="MySQLRoleProvider">
      <providers>
        <clear />
        <add name="MySQLRoleProvider"
             type="MySql.Web.Security.MySQLRoleProvider, MySql.Web,Version=6.7.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"
             connectionStringName="MySQLConnString" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="MysqlSessionProvider">
      <providers>
        <add name="MysqlSessionProvider"
             type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"
             connectionStringName="MySQLConnString" />
      </providers>
    </sessionState>
  </system.web>
<system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient"
           description=".Net Framework Data Provider for MySQL"
           type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data" />
    </DbProviderFactories>
  </system.data>

  5.  到目前為止,正常情況下或者使用CodeFirst或者使用Migration,應該都可以實現MVC3 在MySql下登錄和注冊模塊的功能。:)恭喜已經接近成功了。

  6.  之所以不直接使用MVC4是因為MySql 對MVC4的支持並不是太好,時不時會出現很多問題;所以建議使用MVC3按以上步驟調試OK后再往MVC4上轉換;所謂轉換只是用MVC3的相關權限功能模塊來替換掉MVC4的,主要包括AccountController,AccountModels,相關View,Global.asax。

 1  protected void Application_Start()
 2         {
 3             AreaRegistration.RegisterAllAreas();
 4 
 5             WebApiConfig.Register(GlobalConfiguration.Configuration);
 6             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
 7             RouteConfig.RegisterRoutes(RouteTable.Routes);
 8             BundleTable.EnableOptimizations = true;
 9             BundleConfig.RegisterBundles(BundleTable.Bundles);
10             AuthConfig.RegisterAuth();
11             BCRMonitor.RegisterGlobalMonitor(Server.MapPath(string.Format("~/photos/")));
12 
13             //AreaRegistration.RegisterAllAreas();
14 
15             // Use LocalDB for Entity Framework by default
16            // Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");
17 
18            // RegisterGlobalFilters(GlobalFilters.Filters);
19             //RegisterRoutes(RouteTable.Routes);
20         }

  7. 可能在上一步驟進行過程中會出現一些問題,耐心調試就OK了。

  注意事項:

    a.  mysql出現異常“ Every derived table must have its own alias” 此種問題在linq to mysql 的過程中也可能會遇到,只是linq to sql本身就是MS為Sqlserver開發的,當涉及到多表綜合查詢時,對mysql的支持就不太好了,如語句 return GetAll("").Where(x => x.Id == id).Take(1).SingleOrDefault(); 就會引起此類問題,可以換種linq寫法規避。

     b.  在使用NuGet引用MySql.Data.Entity時注意其版本需要和packages.config,web.config,MySQL for Visual Studio 1.0.2 等中一致,否則也會提示錯誤:

System.IO.FileNotFoundException: 未能加載文件或程序集"MySql.Data, Version=6.1.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"或它的某一個依賴項。系統找不到指定的文件。

    c.  System.ArgumentException: 不支持關鍵字: “metadata”。 錯誤原因可能是connection string provider 未修改成 providerName="MySql.Data.MySqlClient"  


免責聲明!

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



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