【发布时间】: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