[C#.NET][Entity Framework] 解決 Code First @ MySql 出現 "Specified key was too long; max key length is 767 bytes"

[C#.NET][Entity Framework] 解決 Code First @ MySql 出現 “Specified key was too long; max key length is 767 bytes”

開始之前請閱讀以下相關聯結

http://www.dotblogs.com.tw/yc421206/archive/2014/03/14/144395.aspx

http://www.dotblogs.com.tw/yc421206/archive/2014/01/20/141712.aspx

http://www.dotblogs.com.tw/yc421206/archive/2014/01/21/141824.aspx

 

 

環境

  1. 從NuGet安裝 MySql.Data.Entities 版本為 6.8.8.3,裝完後會加入 MySql.Data.dll 、MySql.Data.Entity.EF6.dll 參考
  2. VS2013
  3. MySQL Installer 5.6.16

http://dev.mysql.com/downloads/windows/installer/

安裝後的版本號

image

 

 

準備環境

建立 Model class 專案,並使用 NuGet加入 MySql 相關元件,不知道要加入什麼元件的請點選第一個連結

建立Table 類別,這將同等資料庫的 Table 和 Schema

 

public class Identity
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public string Account { get; set; }
}

用來操作實體資料庫的 DbContext 類別,其中”mySql” 為讀取設定檔連線字串的 Name
{
    public DbSet<Identity> Identities { get; set; }

    public SystemDbContext()
        : base("mySql")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<SystemDbContext>());
    }
}
 
加入測試用的 Winform 專案,並使用 NuGet加入 MySql 相關元件
在App.conifg
加入 provider 

 

 

 

 

加入連線字串


 
 

 

 


 

調用 SystemDbContext

{
    using (var dbContext = new SystemDbContext())
    {
        dbContext.Identities.Load();
    }
}

 
按下按鈕得到了以下錯誤訊息

image

 

 

為了此問題找到了下篇文章,並按照內容實際操作過

http://stackoverflow.com/questions/20832546/entity-framework-with-mysql-and-migrations-failing-because-max-key-length-is-76

 

 

但最後我使用下篇解法,比較簡單

http://stackoverflow.com/questions/20602114/mysql-connector-6-8-2-rc-entity-framework-6-and-code-first

 

 

在 SystemDbContext 加上 [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] ,

Note.

Database.SetInitializer(new DropCreateDatabaseAlways<SystemDbContext>()); 這一行若資料庫不存在會出錯,為了不要手動 Drop 資料庫,可以讓EF幫我重新建立資料庫,所以我加了這一行,測試完成後應該拿掉,不然資料庫永遠都沒資料,開發初期我習慣這樣做,用來觀察 Code First 後的 Schema 跟我心中預設的是否相同

 

public class SystemDbContext : DbContext
{
    public DbSet<Identity> Identities { get; set; }

    public SystemDbContext()
        : base("mySql")
    {
        Database.SetInitializer(new DropCreateDatabaseAlways<SystemDbContext>());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //modelBuilder.Configurations.AddFromAssembly(typeof(SystemDbContext).Assembly);
    }
}

 

再執行一次就錯誤就沒有出現了,希望我花了一兩個小時解決的問題,有幫到你。


文章出自:http://www.dotblogs.com.tw/yc421206/archive/2014/03/15/144399.aspx

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo