簡體   English   中英

.net core 2 實體框架遷移不起作用

[英].net core 2 entity framework migrations not working

我在 .net core 2.0 中添加數據庫遷移時遇到問題。 我收到以下錯誤:

An error occurred while calling method 'BuildWebHost' on class 'Program'. Continuing without the application service provider. Error: One or more errors occurred. (Webpack dev middleware failed because of an error while loading 'aspnet-webpack'. Error was: Error: Cannot find module 'aspnet-webpack'
    at Function.Module._resolveFilename (module.js:469:15)
    at Function.Module._load (module.js:417:25)
    at Module.require (module.js:497:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (C:\Users\Dries\AppData\Local\Temp\quzf2u2y.rt0:83:19)
    at __webpack_require__ (C:\Users\Dries\AppData\Local\Temp\quzf2u2y.rt0:20:30)
    at createWebpackDevServer (C:\Users\Dries\AppData\Local\Temp\quzf2u2y.rt0:62:26)
    at C:\Users\Dries\AppData\Local\Temp\00o3h05d.izo:114:19
    at IncomingMessage.<anonymous> (C:\Users\Dries\AppData\Local\Temp\00o3h05d.izo:133:38)
    at emitNone (events.js:86:13)
Current directory is: D:\Projects\Jeroen Fiers\Projecten\Fiers\bin\MCD\Debug\netcoreapp2.0
)
Unable to create an object of type 'ApplicationDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

我的 Program.cs 調整如下:

public class Program{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}

奇怪的部分是遷移以前(一次)有效。

天哪,真是個愚蠢的錯誤(我真的不明白)。

我正在使用命令dotnet ef migrations add InitialCreate like this link sais https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/migrations

這給出了發布的錯誤,但是當我使用Add-Migration InitialCreate它工作正常嗎?

檢查Startup.cs文件的Configure()方法中是否有一些數據庫初始化代碼(例如數據播種方法):如果有,您可以通過從那里刪除該代碼並將其移動到程序中來解決您的問題.cs文件的Main()方法如下:

public static void Main(string[] args)
{
    // REPLACE THIS:
    // BuildWebHost(args).Run();

    // WITH THIS:
    var host = BuildWebHost(args);
    using (var scope = host.Services.CreateScope())
    {
        // Retrieve your DbContext isntance here
        var dbContext = scope.ServiceProvider.GetService<ApplicationDbContext>();

        // place your DB seeding code here
        DbSeeder.Seed(dbContext);
    }
    host.Run();

    // ref.: https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .Build();

此類問題是由於在 EF Core 2.x 中它們改變了BuildWebHost方法的工作方式:現在它調用Startup.cs文件中的Configure方法,如果該方法包含一些數據庫初始化代碼。

主要問題是,只要在第一個dotnet ef migrations add / dotnet ef database update命令執行之前運行種子代碼,此類問題很可能會引發誤導性異常——當數據庫尚不存在時:之后,他們找到了一個有效的數據庫並在不引發任何異常的情況下完成他們的工作。

有關其他信息,請查看MS 官方 EF Core 1.x 到 2.x 遷移指南以及我針對該主題撰寫的這篇博客文章

例如,如果您的解決方案中有 2 個項目:UiProject & DataProject

首先將您的 ui 項目設置為啟動。 然后在 powershell 中轉到您的 DataAccess 項目,然后:

1: dotnet ef migrations add firstMigrate --startup-project ./UiProject
2: dotnet ef database update --startup-project ./UiProject

當遇到這樣的錯誤時,在 PowerShell 中使用-Verbose標志或在終端中使用--verbose來發現在啟動和終止 EF 期間拋出的代碼(或者可能是您正在使用的 Nuget 包)中的異常會很有幫助核心管道。 它可能與 DbContext 相關或完全無關。

Add-Migration MyMigration -Verbose

dotnet ef migrations add MyMigration --verbose

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM