【问题标题】:Entity Framework migration error实体框架迁移错误
【发布时间】:2018-04-09 17:58:25
【问题描述】:

我在现有的 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] 删除约束 [FK_ApplicationUserToken_AspNetUsers_UserId];
System.Data.SqlClient.SqlException (0x80131904):找不到对象“ApplicationUserToken”,因为它不存在或您没有权限。

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用者HasConnectionLock,布尔异步关闭)
在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean & dataReady)
在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名,布尔异步,Int32 超时,布尔异步写入)
在 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://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/

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

【问题讨论】:

  • 似乎在您的数据库中找不到 FK_ApplicationUserToken_AspNetUsers_UserId 键。异常很明显...
  • 你在哪里定义了ApplicationUserToken。上面分享的代码没有指定ApplicationUserToken。检查您的代码是否存在错误。还要检查您的数据库是否正在使用您尚未定义的任何其他键。

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


【解决方案1】:

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

【讨论】:

  • 所以看起来迁移构造函数中的第一行是ApplicationUserToken的DropForeignKey。如果它的第一行它的概率首先被击中,这可能意味着我的数据库没有被击中吗?我最近从 .NET 1.1.4 迁移到 .NET 2.0.0,所以我必须检查我的更改。
  • 这可能是个问题,因为 System.Data.SqlClient.SqlException (0x80131904) 显示访问错误。
  • 您还有什么可以推荐我尝试的吗?我完全被难住了。我从另一个不再在这里的开发者那里接手这个项目,所以这对我来说是全新的。
【解决方案2】:

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

【讨论】:

  • 我不认为这是用户的问题。他的连接有问题。重新创建 Db 并没有多大帮助。
【解决方案3】:

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

解决这个问题

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

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

  3. 这个错误很像来自试图删除FK_ApplicationUserToken_AspNetUsers_UserId的语句,通常写成这样:

    migrationBuilder.DropForeignKey( 名称:“FK_ApplicationUserToken_AspNetUsers_UserId”, table: "你的桌子")

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

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

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2013-09-17
    • 1970-01-01
    • 2015-05-11
    • 2013-01-02
    • 2013-04-04
    相关资源
    最近更新 更多