【问题标题】:ASP.NET MVC4 + Entity Framework 5 - Incorrect DB name on SaveChanges()ASP.NET MVC4 + Entity Framework 5 - SaveChanges() 上的数据库名称不正确
【发布时间】:2014-11-21 15:30:49
【问题描述】:

我有 MVC4 + EF5 应用程序,web.config 中有单个 connectionString,并且使用了单个 DBContext。

我有一个简单的 Create 控制器。

我已在 DEV 中成功运行我的应用程序。

我正在尝试移动到涉及新数据库的 UAT,因此我更新了 connectionString,并且在 SaveChanges() 上我得到了一个 DBUpdate 异常,例如:

{"无效的对象名称'DBNAME.dbo.TABLENAME'。"}

其中 DBNAME 是我的 DEV 数据库名称。但是我可以看到正在建立连接以更正 SQL Server 实例。我所有的 AJAX/JSON 表单方法都可以很好地连接到数据库。只有当我保存表单时,我才会遇到 EF 试图在正确的 SQL Server 上查找错误数据库的问题。

如果我以不适合我的模型的方式修改目标表,则在 SaveChanges() 上,我将收到异常抱怨不匹配...所以似乎只有当目标架构正确时,对于EF 回退到我的 DEV DB 名称的某些原因。

可以在哪里缓存旧的数据库名称?现在任何地方都没有提到它。我怎样才能“重置”这个?

编辑:忘了提及我使用的是 Code First,但架构已经存在。我只是手动编写了模型类,没有使用 DatabaseMigrations。 EDIT2:我刚刚使用 Database First 重新编写了整个应用程序,并且得到了同样的结果!!到底他妈发生了什么?模型或连接字符串中未提及的数据库名称可能来自哪里?我已经清理/重建了解决方案;发布到另一个网络框;已删除临时 ASP.NET 文件.. 我完全迷路了!

EDIT3例外:

[SqlException (0x80131904): Invalid object name 'WRONGDATABASENAME.dbo.WorkspaceRequest'.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +404
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() +412
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
   System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +59
   System.Data.SqlClient.SqlDataReader.get_MetaData() +118
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +6384561
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +6386130
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +538
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +28
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +256
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +19
   System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues) +270
   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +536

[UpdateException: An error occurred while updating the entries. See the inner exception for details.]
   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +11194398
   System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) +833
   System.Data.Entity.Internal.InternalContext.SaveChanges() +218

[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.]
   System.Data.Entity.Internal.InternalContext.SaveChanges() +291

(很抱歉措辞懒惰——我一直在做这件事,现在感到疲倦和沮丧)

【问题讨论】:

  • 数据库名称来自连接字符串。你如何将连接字符串传递给你的上下文?
  • 我在 web.config 中有一个与我的 DBContext 匹配的 connectionString 名称,但我也尝试在 DBContext 构造函数中对连接字符串进行硬编码。连接字符串指定正确的数据库名称name

标签: asp.net-mvc entity-framework


【解决方案1】:

我发现了这个问题。结果证明 EF 使用了 ODBC 异常,而我在目标表上有一个无效的触发器(指向旧的 DB 名称),生成了冒泡到调试器的异常。

【讨论】:

    【解决方案2】:

    在整个解决方案中搜索“WRONGDATABASENAME.dbo.WorkspaceRequest”

    您应该能够在 edmx 文件的 XML 视图中看到它。

    另外,尝试从 edmx 中删除所有项目并再次更新?

    【讨论】:

    • 谢谢。试过了。该名称不会出现在源代码中的任何位置。我构建了一个全新的 EDMX(以前没有——只有 .cs 模型类)。还是一样的问题
    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2016-02-02
    • 2017-09-02
    • 2021-03-08
    • 1970-01-01
    相关资源
    最近更新 更多