实体框架迁移错误

5

我在现有的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时,我收到以下错误信息:

fail: Microsoft.EntityFrameworkCore.Database.Command[200102]
Failed executing DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
ALTER TABLE [ApplicationUserToken] DROP CONSTRAINT [FK_ApplicationUserToken_AspNetUsers_UserId];
System.Data.SqlClient.SqlException (0x80131904): Cannot find the object "ApplicationUserToken" because it does not exist or you do not have permissions.

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 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(TaskCompletionSource1 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://learn.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/的说明,将其移至program.cs并不能解决问题。似乎无法找出问题所在。


似乎在您的数据库中找不到FK_ApplicationUserToken_AspNetUsers_UserId键。异常非常清楚... - Ringo
你在哪里定义了ApplicationUserToken?上面分享的代码没有指定ApplicationUserToken。检查你的代码是否有错误。还要检查一下你的数据库是否使用了你没有定义的其他键。 - aman
4个回答

3
给出的代码没有表明任何对ApplicationUserToken的更改。因此,请确保您连接到相同的数据库(验证您的上下文文件)。检查是否已经初始化了您的DBContext。

看起来迁移构造函数中的第一行是 ApplicationUserToken 的 DropForeignKey。如果它是第一行,那么它很可能会被首先处理,这可能意味着我的数据库没有被访问对吧?最近我从.NET 1.1.4迁移到了.NET 2.0.0,所以我需要审核一下我的更改。 - user6728767
可能会出现问题,因为 System.Data.SqlClient.SqlException (0x80131904) 表示访问错误。 - Anis ur Rehman
你还有什么其他建议吗?我完全被难住了。我正在接手这个项目,而原来的开发人员已经离开了,所以这对我来说都是新的。 - user6728767

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

我认为那不是用户的问题。他遇到了连接问题。重新创建数据库也不会有太大帮助。 - slfan

0
问题在于您有一个迁移,由于某种原因引用了未创建或已删除的约束。
为了解决这个问题:
  1. 检查您数据库中的迁移历史表(_EFMigrationsHistory),以了解最后一次成功的迁移。

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

  3. 错误很可能来自试图删除 FK_ApplicationUserToken_AspNetUsers_UserId 的语句,通常写成:

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

  4. 您可以注释此语句或将其删除。

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


0

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

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

之后运行另一个命令 命令:Update-Database(它将帮助将代码与SQL服务器同步,并在数据库中创建表)

完成后打开终端,然后运行以下命令

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

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


欢迎来到SO!请不要链接到外部资源以获取解决方案,除非是维基页面和文档的附加信息。 请参考如何撰写好答案指南,以提高您的贡献。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接