繁体   English   中英

实体框架迁移错误

[英]Entity Framework migration error

我向现有的 SQL 服务器数据库添加了一个新表。 我使用它生成的 id 作为键。 我运行了do.net 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);
                });

现在,当我运行do.net ef database update时出现此错误:

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

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,Boolean breakConnection,操作1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.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.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& dataReady)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名称,Boolean 异步,Int32 超时,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
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
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)

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

编辑:

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

`

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

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

`

根据https://learn.microsoft.com/en-us/as.net/core/migration/1x-to-2x/

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

给定的代码并不表示 ApplicationUserToken 有任何变化。 因此,请确保您连接到同一个数据库(验证您的上下文文件)。 检查您是否已调用初始化您的 DBContext。

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

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

为了解决这个

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

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

  3. 该错误最类似于试图删除FK_ApplicationUserToken_AspNetUsers_UserId ,通常写成:

    migrationBuilder.DropForeignKey( name: "FK_ApplicationUserToken_AspNetUsers_UserId", table: "Your table")

  4. 您可以评论此声明或将其删除

  5. 尝试再次更新您的数据库

为此,首先确保您已正确写入数据文件。 如果正确,则在 package 管理器控制台中运行迁移文件,即

命令:Add-Migration Migration_name(如果您的解决方案资源管理器中有迁移文件夹,则首先删除该文件夹并运行此命令)

在此之后运行另一个命令命令:更新数据库(它将有助于将代码与 sql 服务器同步并在数据库中创建一个表)

在此之后打开您的终端然后运行以下命令

首先检查你是否在你的项目中,这意味着你应该在运行“dir”命令时看到项目的文件夹(可以通过执行以下命令看到)

命令:dir 如果您不在您的项目目录中,则切换到您的项目,即命令:cd projectname 然后命令:do.net run seeddata

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM