【问题标题】:Scaffold-DbContext (EF Core Tools) throws 'Instance failure' exceptionScaffold-DbContext(EF Core 工具)抛出“实例失败”异常
【发布时间】:2019-02-10 12:43:19
【问题描述】:

上下文

目前,我正在使用 .NET Core 创建用 C# 编写的提取、转换和加载 (ETL) 应用程序。 ETL 应用程序的目标是通过 Entity Framework Core 2.1.0 和更高版本 2.1.1 访问的数据库。使用数据库优先方法,因为模式是固定的。 Microsoft 提供以下guide 来解决这种情况。该指南指出,Package Manager Console 中的 CLI 命令Scaffold-DbContext 可用于生成 DbContext 和相应的实体模型。

在这个项目的早期,我已经成功地使用了这个 CLI 命令。然而,模型的命名并不直接对应于表名和列名。此 CLI 工具的较新版本提供了一个选项 -UseDatabaseNames,因此我选择重新运行此命令以生成一些更新的模型。此外,我计划在未来更频繁地重新生成 DbContext。

问题

不幸的是,现在运行 Scaffold-DbContext 命令会返回以下错误:Instance failure.。详细选项可以更深入地了解发生了什么问题,但我不清楚到底发生了什么问题以及如何解决它。

命令

Scaffold-DbContext "[ConnectionString]" Microsoft.EntityFrameworkCore.SqlServer -UseDatabaseNames -OutputDir Models -v -force

详细输出

Using project '[ProjectName]'.
Using startup project '[ProjectName]'.
Build started...
Build succeeded.
C:\Program Files\dotnet\dotnet.exe exec --depsfile C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.deps.json --additionalprobingpath C:\Users\[MyComputerUsername]\.nuget\packages --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.runtimeconfig.json C:\Users\[MyComputerUsername]\.nuget\packages\microsoft.entityframeworkcore.tools\2.1.1\tools\netcoreapp2.0\any\ef.dll dbcontext scaffold Server=[ConnectionString] Microsoft.EntityFrameworkCore.SqlServer --json --output-dir Models --use-database-names --force --verbose --no-color --prefix-output --assembly C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.dll --startup-assembly C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1\[ProjectName].Service.dll --project-dir C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\ --language C# --working-dir C:\Repos\[Client]\[ProjectName]\[ProjectName] --root-namespace [ProjectName].Service
Using assembly '[ProjectName]'.
Using startup assembly '[ProjectName]'.
Using application base 'C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\bin\Debug\netcoreapp2.1'.
Using working directory 'C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service'.
Using root namespace '[ProjectName]'.
Using project directory 'C:\Repos\[Client]\[ProjectName]\[ProjectName]\[ProjectName].Service\'.
The EF Core tools version '2.1.1-rtm-30846' is older than that of the runtime '2.1.2-rtm-30932'. Update the tools for the latest features and bug fixes.
Finding design-time services for provider 'Microsoft.EntityFrameworkCore.SqlServer'...
Using design-time services from provider 'Microsoft.EntityFrameworkCore.SqlServer'.
Finding design-time services referenced by assembly '[ProjectName]'.
No referenced design-time services were found.
Finding IDesignTimeServices implementations in assembly '[ProjectName]'...
No design-time services were found.

异常

System.InvalidOperationException: Instance failure.
   at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover)
   at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal.SqlServerDatabaseModelFactory.Create(DbConnection connection, IEnumerable`1 tables, IEnumerable`1 schemas)
   at Microsoft.EntityFrameworkCore.SqlServer.Scaffolding.Internal.SqlServerDatabaseModelFactory.Create(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas)
   at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas, String namespace, String language, String contextDir, String contextName, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions)
   at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable`1 schemas, IEnumerable`1 tables, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable`1 schemaFilters, IEnumerable`1 tableFilters, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
Instance failure.

如前所述,我不清楚到底出了什么问题。我的谷歌搜索没有产生任何相关信息。此外,我尝试更新 SDK、工具和其他参考资料。我尝试删除 DbContext 和模型。任何帮助将不胜感激!

【问题讨论】:

  • 连接字符串中的数据库实例是否正确?
  • 非常感谢!显然连接字符串结构有效果。 Server=[Name1]\\[Name2];Database=[Databasename];Trusted_Connection=True; 的结构(带和不带双反斜杠)导致异常。但是,连接字符串 Data Source=[Name1]\[Name2];Initial Catalog=[DatabaseName];Integrated Security=True; 确实有效。如果您将此评论表述为答案,我会接受并投票赞成。
  • 我很乐意,但我真的不明白为什么“服务器”关键字被拒绝。根据docs,“服务器”和“数据源”是等价的(参见“数据源-或-服务器-或-地址-或-地址-或-网络地址”)。
  • 就我而言,我删除了obj 和bin 文件夹并且它起作用了。

标签: .net-core ef-database-first ef-core-2.1 entity-framework-core-2.1 entity-framework-core-migrations


【解决方案1】:

这确实是一个实例错误。我从我的一个课程中复制了连接字符串。我的 SQL 服务器实例是 PC\Expresss,但我的连接字符串是 PC\\Express,只是删除了一个反斜杠。

【讨论】:

  • 非常感谢。我从文件 appsettings.json 复制了连接字符串,但忘记从中删除 1 个额外的反斜杠,并且在 PMC 中引发了错误。删除一个额外的反斜杠和 PMC 很高兴。
  • @#$!^%$&$# 用词错误!!!!哇,很容易解决。
  • 非常感谢!我也犯了同样的错误。
【解决方案2】:

是的,这通常是在 PM 控制台上的脚手架 dbcontext 命令中拼错实例名称的问题。

您可以使用这个小 TSQL 找出您的 SQL Server 实例的确切拼写:SELECT @@SERVERNAME

【讨论】:

  • 谢谢@t_plusplus。你拯救了我的一天。
  • 好的,当然,我只是没明白它是在谈论 那个 实例,而不是一个 EF 试图创建!参数。
【解决方案3】:

我认为您需要更改实例名称。

例如:

Scaffold-DbContext "Server=PC\SQLEXPRESS;Database=***;User ID=sa;密码=****" Microsoft.EntityFrameworkCore.SqlServer -OutputDir 模型

所以在这种情况下您的实例是:PC\\SQLEXPRESS。 这个实例应该是这样的:.\SQLEXPRESS

【讨论】:

  • 非常感谢您提供正确的解决方案。它拯救了我的一天
  • 非常感谢。我从文件 appsettings.json 复制了连接字符串,但我忘记从中删除 1 个额外的反斜杠,并且在 PMC 中引发了错误。删除一个额外的反斜杠和 PMC 很高兴。
  • 很好的答案! +1 来自我。非常感谢! :)
  • 您仍然可以使用计算机名称,例如PC\SQLEXPRESS。它只是打破它的双反斜杠。给我修好了……瞧!
猜你喜欢
  • 2018-11-02
  • 2021-01-02
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多