实体框架核心 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

实体框架核心错误:使用服务器“localhost”上的数据库“”连接发生错误

实体框架 - 分层设计 - 将连接字符串放在哪里?

LINQ 实体框架查询在 EF Core 中不起作用,引发异常