实体框架错误地引用已删除的列

时间:2015-09-17 17:14:00

标签: c# entity-framework dbcontext

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

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

{"列名无效' ROWID'。\ r \ n无效的列名' ROWID'。"}

使用 dbContext.SaveChanges()方法时出现错误

以下是堆栈跟踪:

  

at System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action' 1 wrapCloseInAction)      在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& dataReady)      在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)      在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 timeout,Task& task,Boolean asyncWrite,SqlDataReader ds)      在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String方法,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.Execute(UpdateTranslator translator,EntityConnection connection,Dictionary' 2 identifierValues,List`1 generatedValues)      在System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager,IEntityAdapter adapter)

1 个答案:

答案 0 :(得分:0)

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

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