1

环境:

  • 视窗 8.1
  • 视觉工作室 2013
  • 项目类型:ASP.NET MVC
  • 在 IIS Express 中进行调试。
  • 点网:4.5
  • 数据库:SQLExpress 2012
  • 实体框架 5

当我在调试或发布配置中运行我的解决方案 (F5) 时,我可以毫无问题地通过 EF 操作数据;数据更改在视图之间持续存在。但是,如果我在 Management Studio 中查询数据库,则没有任何更新反映在其中。如果我在 Management Studio 中更新记录,这些更改也不会反映在我正在运行的解决方案中。

如果我然后停止并重新启动,甚至只是停止并在 VS 中进行构建(CTRL、SHIFT、B),我在 Web 应用程序中的数据都会通过 Management Studio 恢复到与我的数据库匹配的状态。

如果我向数据库添加跟踪,我可以看到读取,但没有写入通过数据库。此外,如果我停止 SQLExpress 服务,我的页面会抛出“SQL Server 服务已暂停/停止”异常。奇怪的是,它看起来像是从正确的数据库中读取,但可能正在写入某个地方的开发缓存?

这让我认为,在每次构建中,数据库的副本都被用于调试/运行会话的状态。

那么问题就变成了,这是在哪里设置的,临时数据库在哪里?我已经搜索了我的 web.config、web.debug.config、web.release.config,但是没有对备用数据库的引用。

我查看了 /App_Data 和 /bin 文件夹,但那里也没有额外的数据库。我什至使用 procmon 观察文件系统,以查看 VS 通过构建执行的任何文件操作,但我找不到任何值得注意的东西(有大量数据,所以可能遗漏了一些东西)。

我有几个调试语句吐出 EF 正在使用的连接字符串,并且可以确认它指向正确的 SQLExpress 实例。

System.Diagnostics.Debug.WriteLine("Conn String: " + ctx.Database.Connection.ConnectionString);

唯一的另一种可能性是 EF 突然持有一个大缓存。我对此表示怀疑,因为我经常跟踪数据库并且更新通常会立即发生。

这种行为相对较新,但不知道它是什么时候开始的。唯一的重大变化是从 2012 年到 2013 年的 VS 升级,但不能确定它是否与升级相关。

无论如何,我现在已经走到了尽头,并且希望有任何我可以遵循的建议。

4

2 回答 2

1

好的,我想通了。因此,对于其他有类似问题的人来说,它与同步 EF 上下文有关。

我使用静态上下文引用来声明我的类,以节省必须在每个方法中声明它,因此:

public class MyClass : Controller
{

    private static MyContext db = new MyContext();

    ...
}

正如您所料,它是静态的,它在启动时进行评估,并保存在内存中。

再加上我正在更改从静态上下文中检索到的对象的属性,但更新到不同的上下文(辅助函数混淆),所有这些都导致了我看到的混淆状态。

所以这个故事的寓意:不要使用静态上下文引用。在需要时声明它们。仔细检查您是否正在检索和更新到相同的上下文。

于 2013-11-11T23:06:25.763 回答
0

Visual Studio 安装 sqlexpress,通常这是代码首先使用的。您可以使用 management studio 连接到 express 实例。也有可能它在默认情况下使用 localdb,而 vs 2013 在 2012 年仍然是可选的。

于 2013-11-08T03:39:03.923 回答