实体框架不正确地引用已删除的列

本文关键字:删除 引用 框架 不正确 正确地 实体 | 更新日期: 2023-09-27 18:13:08

在我的数据库和EF EDmX模型中有一个名为ROWID的列。我不想再要那个列了,所以我从表 (包括它使用的约束和索引)中删除了该列。

然后我删除了整个EDMX模型,并从头开始重新创建。当我在这个表中更新一行时,它会抛出一个异常

{"无效的列名'ROWID'。无效的列名"ROWID"。"}

当我使用dbContext.SaveChanges()方法时发生错误

下面是堆栈跟踪:

在System.Data.SqlClient.SqlConnection

。OnError(SqlException异常,Boolean breakConnection, Action'1 wrapCloseInAction)在System.Data.SqlClient.TdsParser。抛出例外和警告(TdsParserStateObject, statobj,布尔callerHasConnectionLock,布尔asyncClose)在System.Data.SqlClient.TdsParser。TryRun(RunBehavior RunBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet, bulkCopyHandler, TdsParserStateObject, statobj, boolean &;dataReady)在System.Data.SqlClient.SqlCommand。FinishExecuteReader(SqlDataReader ds, RunBehavior RunBehavior, String resetOptionsString)在System.Data.SqlClient.SqlCommand。RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior RunBehavior,布尔返回流,布尔异步,Int32超时,任务&asyncWrite, SqlDataReader在System.Data.SqlClient.SqlCommand。RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior RunBehavior,布尔返回流,字符串方法,TaskCompletionSource'1完成,Int32超时,任务&asyncWrite)在System.Data.SqlClient.SqlCommand。InternalExecuteNonQuery(TaskCompletionSource'1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite)在System.Data.SqlClient.SqlCommand.ExecuteNonQuery ()在System.Data.Mapping.Update.Internal.DynamicUpdateCommand。执行(UpdateTranslator translator, EntityConnection连接,Dictionary'2 identifierValues, List ' 1 generatedValues)在System.Data.Mapping.Update.Internal.UpdateTranslator。Update(IEntityStateManager, IEntityAdapter adapter)

实体框架不正确地引用已删除的列

所以我认为这个问题是由于数据库中存在一个触发器。因此EF实际上并没有保存,但它触发了这个保存,其中ROWID列仍然被引用(再次此触发器和列是由实体框架在将数据从Oracle DB迁移到SQL Server时自动创建的。在这个自动创建的触发器中,唯一标识符被设置为默认值,而不是NEWID())

因此,如果您遇到任何类似的问题,您应该检查您正在修改的表上是否有任何触发器