2

我無法將控制器添加到具有EF Core bsaed應用程序的ASP.NET Core MVC中,其中引發了ArgumentNullException,將Exception的Message屬性讀爲「參數名稱:connectionString StackTrace:參數名稱:connectionString「。實體框架核心1.1.1爲連接字符串引發的ArgumentNullException

我的應用程序是在https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/introhttps://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

以下Contoso大學教程docs.microsoft.com由湯姆·戴克斯特拉和裏克·安德森當我嘗試通過選擇「MVC控制器與意見,使用實體框架添加腳手架控制器「通過使用添加控制器對話框中使用以下設置Student類添加腳手架對話框:

Model class:   Student (ContosoUniversity.Models) 
Data context class:  SchoolContext (ContosoUniversity.Data) 
Views:     [All of the following are checked] 
         Generate views 
         Reference script libraries 
         Use a layout page 
         (The layout textbox is left empty as it is set in a Razor _viewstart file) 
Controller name:  StudentController 

點擊在下面的輸出構建過程中添加控制器對話框結果添加按鈕添加的腳手架控制米勒:

C:\ Program Files文件\ DOTNET \ dotnet.exe ASPNET-codegenerator --project 「C:\工作\ NET \ ContosoUniversity \ ContosoUniversity \ ContosoUniversity.csproj」 --no-生成控制器 - -force --controllerName StudentsController --model ContosoUniversity.Models.Student --dataContext ContosoUniversity.Data.SchoolContext --relativeFolderPath Controllers --referenceScriptLibraries --useDefaultLayout命令行:--project C:\ work \ NET \ ContosoUniversity \ ContosoUniversity \ ContosoUniversity.csproj - 無構建控制器--force --controllerName StudentsController --model ContosoUniversity.Models.Student --dataContext ContosoUniversity.Data.SchoolContext --relativeFolderPath控制器 --referenceScriptLibraries --useDefaultLayout Microsoft(R)Build Engine版本15.1.548.43366版權所有(C)Microsoft Corporation。全部 保留所有權利。命令行:--no-dispatch --port-number 5716 --project C:\ work \ NET \ ContosoUniversity \ ContosoUniversity \ ContosoUniversity.csproj --no-build controller --force --controllerName StudentsController --model ContosoUniversity .Models.Student --dataContext ContosoUniversity.Data.SchoolContext --relativeFolderPath控制器 --referenceScriptLibraries --useDefaultLayout --dispatcher-version 1.0.0-rtm-10308查找生成器'controller'...運行生成器'controller' ...嘗試在 內存中編譯應用程序試圖找出 模型和DbContext的EntityFramework元數據:學生值不能爲null.Value不能爲 null。

參數名:的connectionString堆棧跟蹤:參數名稱: 在 Microsoft.VisualStudio.Web.CodeGeneration.ActionInvoker.b__6_0的ConnectionString

在Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(字符串 值,字符串parameterName)以()

在 Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder optionsBuilder,字符串的connectionString,Action`1 sqlServerOptionsAction)在 Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(字符串[] 參數)

在 ContosoUniversity.Startup.b__4_0在 Microsoft.VisualStudio.Web.CodeGeneration.CodeGenCommand(DbContextOptionsBuilder 選項)。執行(字符串[] 參數)

在 Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.DbContextOptionsFactory [TContext](的IServiceProvider applicationServiceProvider,Action`2 optionsAction)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped( ScopedCallSite scopedCallSite,ServiceProvider provider) Microsoft.Extensions.DependencyInjection.ServiceProvider。 <> c__DisplayClass16_0.b__0(的ServiceProvider 提供商)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(的IServiceProvider 提供商類型的serviceType)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](的IServiceProvider 提供商)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(scopedCallSite scopedCallSite,供應商的ServiceProvider)的 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitClosedIEnumerable(ClosedIEnumerableCallSite closedIEnumerableCallSite,供應商的ServiceProvider)的 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite,ServiceProvider provider)at Microsoft.Extensions.DependencyInjection.ServiceProvider。 <> c__DisplayClass16_0.b__0(的ServiceProvider 提供商)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(的IServiceProvider 提供商類型的serviceType)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](的IServiceProvider 提供商)在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextTypes() 在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextType(字符串 名)在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串 contextType)在 Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore.EntityFrameworkServices.TryCreateContextUsingAppCode(類型 dbContextType,類型startupType)運行00:00:17.43

在appsettings.json我的連接字符串定義如下(採用的LocalDB) :在啓動類

"ConnctionStrings": { 
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true" 
}, 

用於ConfigureServices()的實現方法如下:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddDbContext<SchoolContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddMvc(); 
} 

作爲使用SQL Server Express LocalDB的替代方法,我還嘗試使用類似於以下的連接字符串設置,該設置連接到名爲ContosoUniversity1的現有SQL Server數據庫,沒有定義任何表,並且在嘗試時仍然收到相同的ArgumentNullException創建控制器,並貫穿IISExpress的MVC Web應用程序時:我使用Visual Studio 2017年社區與到位ASP.NET核心和Entity Framework以下NuGet包引用實際發行

"ConnctionStrings": { 
    "DefaultConnection": "Server=Skittles;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true" 
}, 

核心 (取自。PackageReferences的csproj文件:

<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" /> 
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" /> 
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" /> 
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" /> 
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1"/> 
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" /> 
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" /> 
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" /> 
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" /> 

有關如何解決此問題的任何建議或想法將不勝感激。

預先感謝您的時間,幫助和耐心。

+1

調試啓動,並確保'Configuration.GetConnectionString (「DefaultConnection」)實際上是返回一個值。那就是你應該先檢查的地方 – Nkosi

+0

Nkosi; 非常感謝您的建議。並且從Jason Roberts的.NET開發博客中借用一句話,「我不應該編寫累代碼」。 我根據您的建議解決問題如下。 – ClockEndGooner

+0

我在Startup.cs中介紹了公共無效ConfigureServices()方法,並着重於使用IConfigurationRoot引用(Configuration)跟蹤ConnectionStrings節的值後,我無法訪問如下所示的appsettings.json鍵ConnectionStrings調試即時窗口: ? Configuration.GetSection( 「的ConnectionStrings」) {} Microsoft.Extensions.Configuration.ConfigurationSection重點 「的ConnectionStrings」 路徑: 「的ConnectionStrings」 值:空 事實證明,一個有拼寫錯誤的ConnectionStrings爲ConnctionString;我錯過了「e」。 – ClockEndGooner

回答

2

調試啓動並確保Configuration.GetConnectionString("DefaultConnection")實際上正在返回一個值。那就是你應該先檢查的地方。

你會發現,是因爲null在設置文件中你拼寫錯誤的關鍵ConnctionStrings

變化

"ConnctionStrings": {... 
}, 

"ConnectionStrings": {... 
}, 
+0

謝謝,恩科西。根據您的原始建議查看類型-o。非常感激你的幫助。 – ClockEndGooner

相關問題