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

时间:2019-05-31 08:59:29

标签: c# asp.net .net-core asp.net-core-webapi

我是软件开发的新手。我目前正在开发Asp.Net Core API。我已经成功完成了Add-migration,当我需要更新数据库时问题就开始了。

错误如下

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'.

非常感谢您的协助。

3 个答案:

答案 0 :(得分:0)

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

我在“ /Migrations/..ModelSnapshot.cs”中的“上”和“下”方法中都找到了它。 和“ / Migrations / .. 20190613110239_InitialCreate”

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

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

答案 1 :(得分:0)

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

自动生成的错误代码

 Price = table.Column<decimal>(type: "decimal(18, 2", nullable: false)

更正的代码

 Price = table.Column<decimal>(type: "decimal(18, 2)", nullable: false)

您将必须在 migrationName.cs和migrationName.Designer.cs 中发现此错误。

答案 2 :(得分:0)

原因:原因主要是因为您在模型类中犯了语法错误,该类将作为表插入到数据库中。

解决方案:

  1. 您可以删除上次迁移、编辑模型类、创建新迁移和更新数据库。
  2. 您可以正确编辑迁移文件

示例: 这是我第一次在模型课上犯的错误 [Column(TypeName ="decimal(18,2")] public decimal Price { get; set; } “decimal(18,2”) 中缺少的第一个括号。 然后我删除了之前的迁移,添加了第一个括号,创建了新的迁移并更新了数据库。 它工作得很好。