【发布时间】: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,Action
1 wrapCloseInAction)1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
在 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)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 并没有修复它。似乎无法弄清楚发生了什么。
【问题讨论】:
-
似乎在您的数据库中找不到 FK_ApplicationUserToken_AspNetUsers_UserId 键。异常很明显...
-
你在哪里定义了ApplicationUserToken。上面分享的代码没有指定ApplicationUserToken。检查您的代码是否存在错误。还要检查您的数据库是否正在使用您尚未定义的任何其他键。
标签: c# asp.net sql-server entity-framework