我在现有的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)
1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
在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(TaskCompletionSource1 completion, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite, String methodName)
2 parameterValues)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary
我不太清楚这意味着什么,因为我没有更改我的数据库上下文文件中的任何其他内容。我只添加了新模型。
编辑:
所以我在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并没有解决它。似乎无法弄清楚发生了什么。
答案 0 :(得分:1)
给定代码并未指示ApplicationUserToken中的任何更改。因此,请确保您已连接到相同的数据库(验证您的上下文文件)。检查是否已调用初始化DBContext。
答案 1 :(得分:0)
我找到了解决此问题的方法,只需创建新数据库并执行命令“ add-migration migrationame”,然后从程序包管理器控制台中更新数据库即可。
答案 2 :(得分:0)
问题是由于某种原因,您进行的迁移引用了尚未创建或删除的约束。
要解决这个问题
检查数据库(_EFMigrationsHistory
)上的迁移历史记录表,以了解上一次成功的迁移。
转到解决方案中的迁移文件夹,并检查在上一次成功迁移之后添加的迁移。
错误最像是来自试图删除FK_ApplicationUserToken_AspNetUsers_UserId
的语句,通常写为:
migrationBuilder.DropForeignKey( 名称:“ FK_ApplicationUserToken_AspNetUsers_UserId”, 表格:“您的表格”)
您可以评论此语句或将其删除
尝试再次更新数据库