寫在前面
前面有篇文章,嘗試了db first方式,但不知道是什么原因一直沒有成功,到最后也沒解決,今天就嘗試下code first的方式。
一個例子
步驟
- mysql-for-visualstudio-1.2.4.msi 下載該文件,然后運行安裝(如果沒安裝,請先安裝)。
- Connector/Net 下載該文件,並安裝(如果沒安裝,請先安裝)
- 使用Nuget安裝EF
- 使用Nuget安裝mysql提供程序。
在上面的步驟完成后,修改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出來了。