在EF中使用MySQL的方法及常見問題

来源:http://www.cnblogs.com/xiaof2000/archive/2016/06/27/efmysql.html
-Advertisement-
Play Games

有時需要在網上租用空間或資料庫,Mysql成本低一些,所以想將sql server轉成mysql…… 註意:在安裝Mysql時要選擇文字集為utf8,否則將不能使用中文(當前也可以在創建資料庫時使用utf8,不過我不知道在ef生成資料庫時如何設置,希望高手指點) 一、在項目中引用mysql的EF包 ...


有時需要在網上租用空間或資料庫,Mysql成本低一些,所以想將sql server轉成mysql……

註意:在安裝Mysql時要選擇文字集為utf8,否則將不能使用中文(當前也可以在創建資料庫時使用utf8,不過我不知道在ef生成資料庫時如何設置,希望高手指點)  

一、在項目中引用mysql的EF包

通過NuGet包管理器安裝:EntityFramework6.1.3、MySql.Data.Entity6.9.8 也可以用nuget的命令行加入:
Install-Package MySql.Data.Entity
 

二、新建相關類

    1、新建 User 實體類     並定義實例的欄位長度,不定義的話會出現Specified key was too long;max key length is 767 bytes 的錯誤,這是因為string 類型直接映射到mysql 中的話是longtext,而mysql 支持最大長度為767 bytes.    public class User     {         public int Id { get; set; }          [StringLength(30)]         public string UserName { get; set; }         [MaxLength(30)]         public string PassWord { get; set; }       }     2、新建 MyContext 類     並說明用MySql進行實現 [DbConfigurationType(typeof(MySqlEFConfiguration))]
      [DbConfigurationType(typeof(MySqlEFConfiguration))]     public class MyContext : DbContext     {         public MyContext()             : base("name=MyContext")//web.config中connectionstring的名字         {         }           public DbSet<User> Users { get; set; }     }  

3、寫測試代碼

            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());               var context = new MyContext();             //插入一行值             context.Users.Add(new User { UserName = "EF6MySQL" });             context.SaveChanges();  

三、配置Web.config

    在<connectionStrings>中加入以下代碼:    <add name="MyContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=MySQL_EF;user id=root;password=root;" providerName="MySql.Data.MySqlClient" />

    完整的web.config如下:

     
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory , EntityFramework" />
    <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>
  <connectionStrings>
    <add name="MyContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=MySQL_EF;user id=root;password=root;" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
</configuration> 

 

  最後,運行程式,完成資料庫自動創建  

常見問題

  • 出現錯誤提示: Specified key was too long;max key length is 767 bytes
        1)查看實體的字元串類型屬性是否設置了長度         2)MyContext 類中是否聲明為生成為mysql 數據類型的 [DbConfigurationType(typeof(MySqlEFConfiguration))]
  • 出現錯誤提示:    Model compatibility cannot be checked because the database does not contain model metadata
        刪除已生成的資料庫後重新運行程式
  • 出現錯誤提示:序列不包含任何匹配元素
        檢查一下:
例如:1.
public class Employee
{
  [Key]
  public int EmployeeId { get; set; }
  public string Name { get; set; }

  [ForeignKey("ManagerId")]
  public Employee Manager { get; set; }
  public int ManagerId { get; set; }
}

[ForeignKey("ManagerId")]
public Employee Manager { get; set; }
public int ManagerId { get; set; }
這個外鍵設置。

 


2.

[Column(TypeName="VARCHAR(254)")]
public string ColumnName { get; set; }
這樣的定義,改成:
[MaxLength(254)] [Column(TypeName="VARCHAR")]
public string ColumnName { get; set; }

3.(以下代碼未測試,因為我不是這樣用的,在下篇文章中將進行測試)
modelBuilder.Entity<Category>()
               .HasKey(c => c.IdCategory )
               .HasOptional(p => p.Children)
               .WithMany()
               .HasForeignKey(c => c.ChildrenId);
改成:
modelBuilder.Entity<Category>()
               .HasKey(c => c.IdCategory )
               .HasMany(p => p.Children)
               .WithOptional()
               .HasForeignKey(c => c.ChildrenId);

.WithMany()換成.WithOptional()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天簡單的介紹 一下啊 android EventBus 的使用 EventBus 在官方介紹中是訂閱......什麼的 一大堆 , 在我android 菜鳥眼裡 就是用來代替android 廣播的 簡單粗暴 效率高; 其實用法挺簡單 的 就 三步 註冊(官方叫訂閱) 接收 取消(取消訂閱). 算了 ...
  • 1、nonnull:字面意思就能知道:不能為空(用來修飾屬性,或者方法的參數,方法的返回值) 代碼: 這樣,你在使用以上方法的時候會出現這種效果提示 同樣,使用屬性的時候: 2、nullable:表示可以為空(使用方法和上面幾乎一樣,但是沒有發現和上面類似的巨集) 代碼(大概看一下,參考上面就行了): ...
  • 作者:楓雪庭 出處:http://www.cnblogs.com/FengXueTing-px/ 歡迎轉載 Android學習心得之 Linux下命令行Android開發環境的搭建 1. 前言2. Java以及Ant安裝3. Android SDK安裝4. Android工程的基礎命令 一、前言 本 ...
  • “階段一”是指我第一次系統地學習Android開發。這主要是對我的學習過程作個記錄。 上一篇階段一:一個簡單的天氣預報應用的完整實現過程(一)完成了應用的核心功能,接下來就要對它進行優化。今天我先優化它的部分UI和設置一些動畫。 首先,說明一下,這部分都是我現學現做的,弄的時候也挺折騰的,所以我想先 ...
  • 1,安裝oracle 10g資料庫並創建一個要恢復的資料庫相同一的實例(註意:最好是新安裝的資料庫,並且安裝的資料庫儘量和要恢復的資料庫的版本一致,並且實例必須一致); 2,以sysdba身份登錄:對控制文件進行備份; sqlplus /nolog;(此處不能加分號,否則黑屏視窗會一閃而過) con ...
  • K-Means聚類演算法是最為經典的,同時也是使用最為廣泛的一種基於劃分的聚類演算法,它屬於基於距離的無監督聚類演算法。KMeans演算法簡單實用,在機器學習演算法中占有重要的地位。對於KMeans演算法而言,如何確定K值,確實讓人頭疼的事情。 最近這幾天一直忙於構建公司的推薦引擎。對用戶群體的分類,要使用KM ...
  • 事務是什麼?事務關鍵在與其原子性。原子性概念是指可以把一些事情當作一個執行單元來看待。從資料庫角度看待。他是指應該全部執行或者全部不執行一條或多條語句的最小組合。當處理數據時候經常確保一件事發生另一件事也隨之發生。或者二件事都不發生。實際上可能達到程度是有幾十件事情或者更多的事情都必須一起發生或者都 ...
  • 電子書為網友wglzaj精心整理,這批資料下載量好評率都非常高,廣受oracle學習者歡迎。文檔共整理了12個精品專題和120個熱門資料的下載地址,推薦給大家希望大家喜歡。目錄0豆下載地址:http://down.51cto.com/data/428209目錄部分預覽: Oracle資料庫性能優化指 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...