实体框架核心 1.1.1 为连接字符串引发 ArgumentNullException
Posted
技术标签:
【中文标题】实体框架核心 1.1.1 为连接字符串引发 ArgumentNullException【英文标题】:Entity Framework Core 1.1.1 ArgumentNullException Thrown For Connection String 【发布时间】:2017-08-19 14:47:52 【问题描述】:我在将控制器添加到带有 EF Core bsaed 应用程序的 ASP.NET Core MVC 时遇到问题,其中抛出 ArgumentNullException 异常的消息属性读取为“参数名称:connectionString StackTrace:参数名称:connectionString”。
我的应用程序遵循 Tom Dykstra 和 Rick Anderson 在 docs.microsoft.com 上的 Contoso 大学教程https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/introhttps://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro
当我尝试通过“添加脚手架”对话框为 Student 类选择“带有视图的 MVC 控制器,使用实体框架”来添加脚手架控制器时,使用“添加控制器”对话框并使用以下设置:
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:\work\NET\ContosoUniversity\ContosoUniversity\ContosoUniversity.csproj" --no-build 控制器 --force --controllerName StudentsController --model ContosoUniversity.Models.Student --dataContext ContosoUniversity.Data.SchoolContext --relativeFolderPath 控制器 --referenceScriptLibraries --useDefaultLayout 命令行:--project C:\work\NET\ContosoUniversity\ContosoUniversity\ContosoUniversity.csproj --no-build 控制器 --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 控制器 --force --controllerName StudentsController --model ContosoUniversity.Models.Student --dataContext ContosoUniversity.Data.SchoolContext --relativeFolderPath 控制器 --referenceScriptLibraries --useDefaultLayout --dispatcher-version 1.0.0-rtm-10308 查找生成器“控制器”...运行生成器“控制器”...尝试在 memory 试图找出 EntityFramework 元数据的 模型和 DbContext:学生值不能为空。值不能为 空。
参数名称:connectionString StackTrace:参数名称: 连接字符串
在 Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String 值,字符串参数名称)在 Microsoft.VisualStudio.Web.CodeGeneration.ActionInvoker.b__6_0()
在 Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder optionsBuilder,字符串连接字符串,操作`1 sqlServerOptionsAction) 在 Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(字符串 [] 参数)
在 ContosoUniversity.Startup.b__4_0(DbContextOptionsBuilder 选项)在 Microsoft.VisualStudio.Web.CodeGeneration.CodeGenCommand.Execute(字符串 [] 参数)
在 Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.DbContextOptionsFactory[TContext](IServiceProvider applicationServiceProvider, Action`2 optionsAction) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProvider 提供者)在 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 提供者)在 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(字符串 上下文类型)在 Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore.EntityFrameworkServices.TryCreateContextUsingAppCode(类型 dbContextType, 类型 startupType) RunTime 00:00:17.43
我在 appsettings.json 中的连接字符串定义如下(使用 localdb):
"ConnctionStrings":
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
,
Startup 类中 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 应用程序时:
"ConnctionStrings":
"DefaultConnection": "Server=Skittles;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
,
我正在使用 Visual Studio Community 2017 的实际版本,并为 ASP.NET Core 和 Entity Framework Core 提供了以下 NuGet 包引用 (取自 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" />
对于如何解决此问题的任何建议或想法将不胜感激。
提前感谢您的时间、帮助和耐心。
【问题讨论】:
调试启动并确保Configuration.GetConnectionString("DefaultConnection")
实际上返回了一个值。这是你应该首先检查的地方
恩科西;非常感谢您的建议。借用 Jason Roberts 的 .NET 开发博客中的一句话,“我不应该对代码感到厌烦”。根据您的建议,我对问题的解决方案如下。
我在 Startup.cs 中逐步完成了 public void ConfigureServices() 方法,并在使用 IConfigurationRoot 引用 Configuration 专注于跟踪 ConnectionStrings 部分值之后,我无法访问 appsettings.json使用 Debug Immediate Window 时如下所示的键 ConnectionStrings: ? Configuration.GetSection("ConnectionStrings") Microsoft.Extensions.Configuration.ConfigurationSection 键:“ConnectionStrings” 路径:“ConnectionStrings” 值:null 原来 ConnectionStrings 拼写错误为 ConnctionString;我错过了“e”。
【参考方案1】:
调试启动并确保Configuration.GetConnectionString("DefaultConnection")
实际上正在返回一个值。那是你应该首先检查的地方。
你会注意到这是null
,因为在设置文件中你拼错了密钥ConnctionStrings
改变
"ConnctionStrings": ...
,
到
"ConnectionStrings": ...
,
【讨论】:
谢谢,恩科西。根据您的原始建议看到了type-o。非常感谢您的帮助。以上是关于实体框架核心 1.1.1 为连接字符串引发 ArgumentNullException的主要内容,如果未能解决你的问题,请参考以下文章
如何从 DBContext(实体框架核心)中的 App.config(不是 .net 核心应用程序)读取值
将实体框架连接字符串转换为 SQL Server Express