如何使用迁移修复更新数据库期间关键字“NOT”附近的错误语法

Ras*_*tle 1 c# asp.net .net-core asp.net-core-webapi

我是软件开发新手。我目前正在开发 Asp.Net Core API。我已成功完成添加迁移,当我需要更新数据库时问题开始。

错误如下

System.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near the keyword 'NOT'.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite)
   at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
   at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:9cf19409-67c7-4553-b2f9-5407db27d008
Error Number:156,State:1,Class:15
Incorrect syntax near the keyword 'NOT'.
Run Code Online (Sandbox Code Playgroud)

我们将非常感谢您的帮助。

小智 9

正如YogeshJadadhav所强调的,您可能需要检查自动生成的文件是否有错误。请注意,调试器可能不会突出显示该错误,因为它不是语法错误,而是字符串错误。这是一段代码,显示了我如何解决这个问题。

自动生成的代码有错误

 Price = table.Column<decimal>(type: "decimal(18, 2", nullable: false)
Run Code Online (Sandbox Code Playgroud)

更正代码

 Price = table.Column<decimal>(type: "decimal(18, 2)", nullable: false)
Run Code Online (Sandbox Code Playgroud)

您必须在migrationName.cs和migrationName.Designer.cs中纠正此错误。


小智 5

我在初始迁移创建数据库时遇到了同样的问题。PMC 控制台抛出“关键字‘NOT’附近的语法不正确。”错误。调试几分钟后,我发现其中一个字段的 .HasColumnType("varchar(3"); 属性。似乎在迁移过程中,自动生成的迁移文件中丢失了一个括号 - 它看起来像这样“HasColumnType("varchar” (3") 相反,它应该看起来像这样 HasColumnType("varchar(3)") 。

我在“/Migrations/..ModelSnapshot.cs”中找到了这个,在“向上”和“向下”方法中。和“/迁移/..20190613110239_InitialCreate”

在这两个地方添加括号后,Update-Database 命令将按预期工作。

我希望它会有所帮助!快乐编码。