沒有為此DbContext配置數據庫上下文提供程序...儘管它已經配置

c# entity-framework-core npgsql

擁有3個程序集的解決方案:數據,域和Web。數據保存上下文,Web是.NET Core WebAPI應用程序,它們都在同一個解決方案目錄中。我也使用Postgre作為數據庫。

這是我在Startup.csConfigureServices方法:

public void ConfigureServices(IServiceCollection services)
{
    string connectionString = Configuration.GetConnectionString("DefaultConnection");
            ...
    services.AddDbContext<WebStoreContext>(
        options => options.UseNpgsql(
            connectionString,
            (providerOptions) =>
            {
                providerOptions.CommandTimeout(20);
                providerOptions.MigrationsAssembly("WebStore.Data");
            }));

    services.AddMvc();
            ...
}

請注意如何使用AddDbContext配置數據庫提供程序並傳遞optionsAction參數。

現在,我使用命令行ef工具為db創建了初始遷移。我已經進入了WebStore.Data並運行:

dotnet ef --startup-project ..\WebStore.Web migrations add IntializeDb

這一切都很好。

當我嘗試從同一目錄運行時,問題就開始了:

dotnet ef database update

在'WebStoreContext'上找不到無參數構造函數。要么將無參數構造函數添加到'WebStoreContext',要么在與'WebStoreContext'相同的程序集中添加'IDbContextFactory'的實現。

我在我的DbContext派生類中聲明一個無參數構造函數之前得到的上述錯誤,以及我聲明一個後面的錯誤:

沒有為此DbContext配置數據庫提供程序。可以通過覆蓋DbContext.OnConfiguring方法或在應用程序服務提供程序上使用AddDbContext來配置提供程序。如果使用AddDbContext,那麼還要確保您的DbContext類型在其構造函數中接受DbContextOptions對象,並將其傳遞給DbContext的基礎構造函數。

所以在我看來,儘管我提供了一個DbContextOptions實例,但無參數構造函數仍然被調用。

那麼我試過這個:

//parameterless constructor calling the one accepting the DbContextOptions argument
public WebStoreContext() : this(new DbContextOptionsBuilder<WebStoreContext>()
.UseNpgsql("UserID=****;Password=****;Host=localhost;Port=****;Database=webstore;Pooling=true;")
.Options){ }

得到了這個:

System.Reflection.TargetInvocationException:調用目標拋出了異常。 ---> System.IO.FileLoadException:無法加載文件或程序集'System.Diagnostics.DiagnosticSource,Version = 4.0.1.1,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。定位的程序集的清單定義與程序集引用不匹配。 (HRESULT異常:0x80131040)

還在試圖弄清楚這裡發生了什麼。非常感謝幫助。

編輯:我應用了Shay Rojansky的解決方案並且它有效,儘管我有以下問題:

System.IO.FileLoadException:無法加載文件或程序集'System.Diagnostics.DiagnosticSource,Version = 4.0.1.1,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。定位的程序集的清單定義與程序集引用不匹配。 (來自HRESULT的異常:0x80131040)文件名:Microsoft.Exntions的Microsoft.EntityFrameworkCore.Infrastructure.RelationalServiceCollectionExtensions.AddRelational(IServiceCollection services)的文件名:'System.Diagnostics.DiagnosticSource,Version = 4.0.1.1,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。 Microsoft的System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey鍵,Func`2 valueFactory)上的Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache。<> c__DisplayClass4_1.b__2(Int64 k)中的DependencyInjection.NpgsqlEntityFrameworkServicesBuilderExtensions.AddEntityFrameworkNpgsql(IServiceCollection services) Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService](IInfrastructure`1訪問者)的Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext的.EntityFrameworkCore.DbContext.InitializeServices() Func`1工廠)在Microsoft.EntityFramewor Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase的Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration,String contextType)中的kCore.Design.Internal.DbContextOperations.CreateContext(String contextType)。<> c__DisplayClass0_1。<。ctor > b__0()at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

無法加載文件或程序集'System.Diagnostics.DiagnosticSource,Version = 4.0.1.1,Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。定位的程序集的清單定義與程序集引用不匹配。 (HRESULT異常:0x80131040)

解決方案將其添加到.csproj文件中:

<PropertyGroup>
        <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
</PropertyGroup>

這顯然是由於一個錯誤

熱門答案

我發現最簡單的解決方案是從上下文中刪除默認構造函數。只需要一個帶有DBContentOptions或DBContentOptions <>的構造函數作為參數,然後傳遞給基類。

public class ApplicationDbContext : DbContext>
{
    #region Constructor
    public ApplicationDbContext(DbContextOptions options) : base(options) { }
    #endregion
}

但同意這並不理想。 Esp,如果您需要使用EF unity IOC之外的上下文。

希望這會幫助其他人。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow