首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Entity Framework Code First Seed 方法泛型參數缺失修復

     編輯:程式設計綜合問答

錯誤:`DbMigrationsConfiguration.Seed` 方法簽名不匹配,導致遷移初始化失敗。

問題代碼

public class Configuration : DbMigrationsConfiguration // 正確指定 TContext
{
    protected override void Seed(MvcDemoEntities context) // ❌ 缺少泛型參數聲明
    {
        // ...
    }
}

正確寫法

public class Configuration : DbMigrationsConfiguration
{
    // ✅ 方法簽名必須匹配基類:Seed(TContext context)
    protected override void Seed(MvcDemoEntities context)
    {
        context.SysControllers.AddOrUpdate(
            c => c.ControllerDisplayName, // 唯一鍵避免重複種子
            new SysController { ControllerDisplayName = "abcd" },
            new SysController { ControllerDisplayName = "asdaf" }
            // ...
        );
        context.SaveChanges(); // 顯式保存
    }
}

關鍵點解析

  1. 泛型傳遞:類聲明已指定 `TContext = MvcDemoEntities`,方法參數直接用該類型即可,**不需再加尖括號**。
  2. AddOrUpdate:`IDbSet.AddOrUpdate(keySelector, entities)` 確保種子數據冪等(重複運行不報錯、不重複)。
  3. Global.asax 註冊:
    Database.SetInitializer(new MigrateDatabaseToLatestVersion());
    替代原 `SetInitializer(new Configuration())`,確保自動遷移到最新版本再執行 Seed。

完整遷移配置模板

internal sealed class Configuration : DbMigrationsConfiguration
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;  // 開發環境建議開啟
        AutomaticMigrationDataLossAllowed = false; // 生產嚴禁
        ContextKey = "MyApp.Models.MyDbContext";
    }

    protected override void Seed(MyDbContext context)
    {
        // 1. 字典/枚舉數據
        context.DictItems.AddOrUpdate(d => d.Code, 
            new DictItem { Code = "GENDER", Value = "Male" },
            new DictItem { Code = "GENDER", Value = "Female" }
        );
        
        // 2. 管理員賬號
        context.Users.AddOrUpdate(u => u.UserName,
            new User { UserName = "admin", PasswordHash = Hash("123456"), Role = "Admin" }
        );
        
        context.SaveChanges();
    }
}

常見坑點

  • ❌ `AutomaticMigrationDataLossAllowed = true` 導致生產環境列刪除數據丟失。
  • ❌ Seed 中調用外部 API/發送郵件,遷移卡死/超時。
  • ❌ 多上下文項目未設置 `ContextKey`,導致遷移歷史表混亂。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved