实体框架迁移错误

时间:2018-04-09 17:58:26

标签: c# asp.net sql-server entity-framework

我在现有的SQL Server数据库中添加了一个新表。我使用它生成的id作为密钥。我运行dotnet ef migration add NewTable,运行没有错误。我查看了迁移文件,这是我为新表添加的内容:

migrationBuilder.CreateTable(
                name: "InboxNotifications",
                columns: table => new
                {
                    Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
                    Created = table.Column<DateTime>(type: "datetime2", nullable: false),
                    CreatedBy = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    DataId = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    EventIdent = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Message = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Status = table.Column<int>(type: "int", nullable: false),
                    TeamIdent = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Title = table.Column<string>(type: "nvarchar(max)", nullable: true),
                    Type = table.Column<int>(type: "int", nullable: false),
                    UserId = table.Column<string>(type: "nvarchar(max)", nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_InboxNotifications", x => x.Id);
                });

现在,当我运行dotnet ef database update时,我收到此错误:

  

失败:Microsoft.EntityFrameworkCore.Database.Command [200102]
  执行DbCommand失败(1ms)[Parameters = [],CommandType ='Text',CommandTimeout ='30']   ALTER TABLE [ApplicationUserToken] DROP CONSTRAINT [FK_ApplicationUserToken_AspNetUsers_UserId];
  System.Data.SqlClient.SqlException(0x80131904):找不到对象“ApplicationUserToken”,因为它不存在或您没有权限。

     

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)
  在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)
  在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&amp; dataReady)
  在System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout,Boolean asyncWrite)
  在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)

我不太清楚这意味着什么,因为我没有更改我的数据库上下文文件中的任何其他内容。我只添加了新模型。

编辑:

所以我在startup.cs中的Configure()中调用了这个函数:

`

public virtual void EnsureDatabaseCreated(TennisFolderContext dbContext,
                              UserManager<ApplicationUser> userManager,
                              RoleManager<ApplicationRole> roleManager,
                              bool createData)
        {

            // run Migrations
            DbInitializer.Initialize(dbContext, userManager, roleManager, createData).Wait();
        }

`

根据https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/

将它移动到program.cs并没有解决它。似乎无法弄清楚发生了什么。

3 个答案:

答案 0 :(得分:1)

给定代码并未指示ApplicationUserToken中的任何更改。因此,请确保您已连接到相同的数据库(验证您的上下文文件)。检查是否已调用初始化DBContext。

答案 1 :(得分:0)

我找到了解决此问题的方法,只需创建新数据库并执行命令“ add-migration migrationame”,然后从程序包管理器控制台中更新数据库即可。

答案 2 :(得分:0)

问题是由于某种原因,您进行的迁移引用了尚未创建或删除的约束。

要解决这个问题

  1. 检查数据库(_EFMigrationsHistory)上的迁移历史记录表,以了解上一次成功的迁移。

  2. 转到解决方案中的迁移文件夹,并检查在上一次成功迁移之后添加的迁移。

  3. 错误最像是来自试图删除FK_ApplicationUserToken_AspNetUsers_UserId的语句,通常写为:

    migrationBuilder.DropForeignKey( 名称:“ FK_ApplicationUserToken_AspNetUsers_UserId”, 表格:“您的表格”)

  4. 您可以评论此语句或将其删除

  5. 尝试再次更新数据库