2017-06-04 67 views
0

有3個程序集的解決方案:數據,域和Web。數據保存上下文,Web是一個.NET Core WebAPI應用程序,它們都在同一個解決方案目錄中。我也使用Postgre作爲數據庫。沒有數據庫上下文提供程序已配置爲此DbContext ...雖然它有

這裏是我的ConfigureServices方法Startup.cs

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創建了初始遷移。 我有CD-ED成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)

仍在試圖弄清楚是怎麼回事。幫助將不勝感激。

編輯: 我申請吉文Rojansky的解決方案,它的工作,雖然我有以下問題:

System.IO.FileLoadException:無法加載文件或程序 「System.Diagnostics.DiagnosticSource ,Version = 4.0.1.1, Culture = neutral,PublicKeyToken = cc7b13ffcd2ddd51'。定位的 程序集清單定義與程序集引用不匹配。 (異常來自HRESULT:0x80131040)文件名:在 Microsoft.EntityFrameworkCore.Infrastructure.RelationalServiceCollectionExtensions.AddRelational(IServiceCollection 服務) 'System.Diagnostics.DiagnosticSource,版本= 4.0.1.1, 文化=中性公鑰= cc7b13ffcd2ddd51'在 Microsoft.Extensions.DependencyInjection.NpgsqlEntityFrameworkServicesBuilderExtensions.AddEntityFrameworkNpgsql(IServiceCollection services)at Microsoft.EntityFrameworkCore.Internal.ServiceProviderCache。 <> c__DisplayClass4_1.b__2(Int64的 K)在 System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKEY的 鍵,Func`2 valueFactory)在 Microsoft.EntityFrameworkCore.DbContext.InitializeServices()在 Microsoft.EntityFrameworkCore。 DbContext.get_InternalServiceProvider() 在 Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService(IInfrastructure`1 訪問)在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 廠)在 微軟.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串 contextType)在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(字符串 targetMigration,字符串contextType)位於 Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase。 <> c__DisplayClass0_1。 < .ctor> b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(動作 動作)

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

到的溶液中添加此到的.csproj文件:

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

發生這種情況顯然是由於一個bug

回答

1

嘗試添加OnConfiguring方法的背景下,作爲建議由EF Core getting started docs

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { 
    optionsBuilder.UseNpgsql("..."); 
} 
+0

似乎無法弄清楚爲什麼會發生這種情況,雖然... – Jakov

0

我遇到這個問題,沒有必要改變什麼,但添加在運行--startup項目參數任何命令。 ex。
dotnet ef數據庫更新 - 啓動項目.. \ WebStore。Web

1

我發現最簡單的解決方法是從上下文中刪除默認構造函數。只需將一個構造函數與DBContentOptions或DBContentOptions <>作爲參數傳遞到基類。

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

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

希望這會幫助其他人。

相關問題