C# 使用EntityFramework連線MySql

fairjm發表於2016-02-29

本文來自 fairjm@ituring.com.cn
轉截請註明出處


本來想用F#的....結果失敗了 去爆棧提了個問題...暫時沒人解答...所以還是用C#吧...哎
為什麼要連MySql,因為Sql Server開箱即用,而且工作中用的是mysql,取資料分析用ADO.NET有點累,一切面向偷懶.

框架使用EF,版本用最新的,一步一步往下做.
因為就是個示例專案所以用good old的Console Application就行啦.
空專案如下:
enter image description here

新增依賴,右擊References,選擇Manage NuGet Packages,選擇browse.搜尋EntityFrameworkMysql.Data.Entity,全部選最新版本. 一路點Yes,accept就好了.

此時package的依賴變成了這樣:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net452" />
  <package id="MySql.Data" version="6.9.8" targetFramework="net452" />
  <package id="MySql.Data.Entity" version="6.9.8" targetFramework="net452" />
</packages>

App.config也變得豐盈了起來:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider>
    </providers>
  </entityFramework>
  <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, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
</configuration>  

依賴搞定,接下來新增實體物件,這裡就不手工寫了,手工寫無非是將連線字串配在App.config下,自己繼承下DbContext,手寫實體類.太累.還是那句話,面向懶惰程式設計.

右擊專案,add -> new item -> data -> ADO.NET Entity Data Model
名字自己取一個
然後按以下步驟新增:
enter image description here enter image description here
關於Port,請點選上圖中的Advanced,在裡面找到Port選項.
按ok之後.

如果你用的依賴項和我一樣,而且裝mysql的時候還裝了.NET的連線,那肯定就是直接退出了.對,你沒看錯,直接退出.

把Nuget的包變成和本地版本一樣(自己匯入引用或者去mysql官網下最新的 那個Mysql Installer不能升級到最新的不知道為什麼),不然點next依舊閃退.
接下來看到了令人激動的這個介面: enter image description here
當點選完成的時候,WTF:
enter image description here

這其實是個bug,mysql的bug... ...解決方法很簡單,要把mysql的一個優化項給關了.
http://stackoverflow.com/questions/33575109/mysql-entity-the-value-for-column-isprimarykey-in-table-tabledetails-is

  1. Open Services (services.msc) and restart MySQL57 service.
  2. Execute the following commands in MySQL. use database_name;
    set global optimizer_switch='derived_merge=OFF';
  3. Update the .edmx.

接下來就好了...可以看到Designer了
enter image description here

接下來就可以愉快地寫程式碼啦~~~
enter image description here

注意如果提示初始化錯誤,檢查一下DbContext裡的初始化引數的值和app.config的連線字串配置是否相同
enter image description here

其實整個過程是比較簡單的.
這裡有幾點注意
本地如果裝了.NET驅動,要注意和依賴包的版本保持一致
那個坑爹的bug

code first也比較簡單.
但也有幾點要注意,這裡有點晚了,我懶得寫具體過程了.....
一定要從空的資料庫初始化,不要有表,不要有表,不要有表... 不然會發生奇怪的事的,是什麼奇怪的事,我不說,你們猜.
請把[DbConfigurationType(typeof(MySqlEFConfiguration))]寫在DbContext子類上(或者改配置檔案) 這一項是code first生成的程式碼裡沒有的.
然後就可以愉快地commit和update資料庫了.

本文終結


本文來自 fairjm@ituring.com.cn
轉截請註明出處

相關文章