標籤:
寫在前面
前面有篇文章,嘗試了db first方式,但不知道是什麼原因一直沒有成功,到最後也沒解決,今天就嘗試下code first的方式。
[EF]vs15+ef6+mysql這個問題,你遇到過嗎?
一個例子
步驟
- mysql-for-visualstudio-1.2.4.msi 下載該檔案,然後運行安裝(如果沒安裝,請先安裝)。
- Connector/Net 下載該檔案,並安裝(如果沒安裝,請先安裝)
- 使用Nuget安裝EF
- 使用Nuget提供者。
在上面的步驟完成後,修改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> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" /> </startup> <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </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.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="MyContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=myshop;user id=sa;password=sa;" providerName="MySql.Data.MySqlClient"/> </connectionStrings></configuration>
注意entityFramework 節點,預設是不會有codeConfigurationType屬性的,請添加。否則會出現下面的錯誤:Specified key was too long; max key length is 767 bytes
測試
實體類
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Wolfy.Ef_MySql_CodeFirst{ public class Product { public int Id { set; get; } [MaxLength(128)] public string Name { set; get; } [MaxLength(128)] public string Category { set; get; } public decimal Price { set; get; } public DateTime CreateDate { set; get; } }}
插入資訊
using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Wolfy.Ef_MySql_CodeFirst{ class Program { static void Main(string[] args) { var dbContext = new MyContext(); IDatabaseInitializer<MyContext> dbInitializer = null; if (dbContext.Database.Exists()) { //如果資料庫已經存在 dbInitializer = new DropCreateDatabaseIfModelChanges<MyContext>(); } else { //總是先刪除然後再建立 dbInitializer = new DropCreateDatabaseAlways<MyContext>(); } //Database.SetInitializer(dbInitializer);
dbInitializer.InitializeDatabase(dbContext); dbContext.Products.Add(new Product() { CreateDate = DateTime.Now.AddDays(1), Name = "南孚電池", Category = "生活用品", Price = 3 }); dbContext.SaveChanges(); } }}
還有一個錯誤經常出現
Model compatibility cannot be checked because the database does not contain model metadata. Model compatibility can only be checked for databases created using Code First or Code First Migrations.
大概意思是:不能檢查模型的相容性,因為資料庫不包含模型中繼資料。在使用code first或者code fisrt遷移進行資料庫建立的時候需要檢查模型的相容性。
此時,雖然產生了表_migrationhistory,但是該表內容為空白。
這個時候可以將資料庫刪除,重建就可以解決。
其中表_migrationhistory為建立曆史表。
Products表
發現添加的資料中中文為亂碼,這是因為mysql預設的字元集為latin
關於亂碼的解決方案很多,你可以修改資料庫的字元集,或者資料表的字元集。也可以這樣,修改連接字串:
<connectionStrings> <add name="MyContext" connectionString="Data Source=localhost;port=3306;Initial Catalog=myshop;user id=sa;password=sa;charset=utf8" providerName="MySql.Data.MySqlClient"/> </connectionStrings>
總結
折騰了一上午,一個簡單的demo出來了。
[EF]vs15+ef6+mysql code first方式