环境:
当我运行我的解决方案(F5)时,在Debug或Release配置中,我可以通过EF操作数据而没有任何问题;视图之间的数据更改仍然存在。但是,如果我在Management Studio中查询数据库,则不会在其中反映任何更新。如果我在Management Studio中更新记录,则更改不会反映在我正在运行的解决方案中。
如果我然后停止并重新启动,甚至只是停止并在VS中执行构建(CTRL,SHIFT,B),我的Web应用程序中的数据都会恢复到通过Management Studio与我的数据库匹配的状态。 / p>
如果我向数据库添加一个跟踪,我可以看到读取,但没有写入数据库。此外,如果我停止SQLExpress服务,我的页面会抛出“SQL Server服务已暂停/停止”异常。非常奇怪,看起来它正在从正确的数据库中读取,但可能正在某处写入开发缓存?
这使我认为在每次构建时,db的副本都用于该调试/运行会话的状态。
那么问题就变成了,这个设置在哪里,临时数据库在哪里生活?我已经浏览了我的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升级,但不能确定它与升级有关。
无论如何,我现在处于系绳的末端,并且会喜欢我可以遵循的任何建议。
答案 0 :(得分:1)
好的,我明白了。因此对于其他有类似问题的人来说,它与同步EF上下文有关。
我用静态上下文引用声明了我的类,因此无需在每个方法中声明它:
public class MyClass : Controller
{
private static MyContext db = new MyContext();
...
}
如你所料,保持静态,它在启动时进行评估,并保存在内存中。
将此添加到我正在更改从静态上下文中检索到的对象的属性,但更新到不同的上下文(帮助函数混淆),这一切都导致我看到的混乱状态。
故事的寓意: 不要使用静态上下文引用。根据需要声明它们。 仔细检查您是否正在检索并更新到相同的上下文。
答案 1 :(得分:0)
Visual Studio安装sqlexpress,通常这是代码首次使用的。您可以使用management studio连接到express实例。它也可能默认使用localdb作为vs 2013在2012年仍然是可选的。