Asp.net web api webAPI+;EF5数据库集包含的本地实体即使在visual studio中重新启动webAPI项目后也不在数据库中
我一直在学习WebAPI+EF5,并基于此创建了我的第一个项目 我在数据库中有一个表,它有ID、NAME、DESCRIPTION列,NAME列上有一个约束,以确保所有记录的名称都是唯一的 当我通过WebAPI项目(在VisualStudio的调试中运行)向db发布十个实体时,这十个项目出现在物理数据库中-酷 如果我调用webAPI控制器上的GET,并检查dbset.Local,我会看到我发布的10个项目,这非常完美 问题是,如果我在VisualStudio中停止WebAPI项目,在SQL management studio中打开DB并删除物理行(代表我上面发布的10项),然后在VisualStudio中重新启动WebAPI调试。如果我执行GET请求(通过fiddler)并通过contoler的GET方法中的断点检查dbset,我发现这10个项仍然是dbset.Local属性中的项,即使底层数据库中没有项。如果我允许GET有效地完成对dbset.ToList()的调用,我将得到一个空的结果集 如果我随后重新发布相同的10个项目,那么这10个项目将再次成功到达数据库,但现在dbset.Local在其本地集合中有20个项目 重新启动WebAPI项目后,为什么dbset.Local不是空的,我可以停止调试去喝杯咖啡重新启动调试和dbset.Local集合中还有20项?这是我遇到的缓存问题吗?在我的项目启动代码中是否需要执行一些操作,以便在每次在visual studio中重新启动项目时清除dbset.Local 另外,为什么dbset.Local不遵守DB中设置的唯一名称的约束,并且允许重复条目进入dbset.Local集合,它是否应该抛出错误 问题是如果我在visual studio中停止WebAPI项目 如果您在ASP.NET中托管了WebAPI(Visual Studio中的标准WebAPI项目将创建这样的项目类型),停止调试器实际上不会停止正在运行应用程序的进程,但它只会将调试器与该应用程序分离。正在运行的进程是Web服务器的工作进程,例如,如果您使用IIS Express作为开发测试服务器,它将保持活动状态。(它通常在Windows屏幕右下角的系统托盘中有一个小图标。您可以在那里停止进程,然后进程“真的”被终止。) 。。。在SQL management studio中打开数据库并删除物理行 (代表我在上面发布的10个项目)Asp.net web api webAPI+;EF5数据库集包含的本地实体即使在visual studio中重新启动webAPI项目后也不在数据库中,asp.net-web-api,entity-framework-5,Asp.net Web Api,Entity Framework 5,我一直在学习WebAPI+EF5,并基于此创建了我的第一个项目 我在数据库中有一个表,它有ID、NAME、DESCRIPTION列,NAME列上有一个约束,以确保所有记录的名称都是唯一的 当我通过WebAPI项目(在VisualStudio的调试中运行)向db发布十个实体时,这十个项目出现在物理数据库中-酷 如果我调用webAPI控制器上的GET,并检查dbset.Local,我会看到我发布的10个项目,这非常完美 问题是,如果我在VisualStudio中停止WebAPI项目,在SQL man
DbSet.Local
是内存中的一个集合。它不会“看到”您在EF上下文之外的另一个进程(SSM)中从数据库中删除了行
…然后在visual studio中重新调试webAPI
如果上述工作进程仍在运行,则重新启动调试器不会启动新进程,而是将调试器附加到现有进程。这一过程中的一切仍然存在
如果我执行GET请求(通过fiddler)并通过中断检查dbset
在contoler的get方法中,我发现这10项是
即使没有项,仍然在dbset.Local属性中
在底层数据库中
由于检查或迭代DbSet.Local
或调用DbSet.Local.ToList()
不会运行数据库查询,因此不会注意到数据库表为空。它只返回内存中的旧数据
如果我允许GET有效地完成调用dbset.ToList()I
获取一个空的结果集
因为DbSet.ToList()
实际上运行的是数据库查询,所以它会发现表是空的,并将结果返回给您
如果我随后重新发布相同的10个项目,那么这10个项目将成功到达
再次使用DB,但现在dbset.Local在其本地
收藏
因为DbSet.Local
在内存中仍然有旧的结果。虽然以前对数据库的DbSet.ToList()
查询返回了一个空列表以提供正确的查询结果,但这并不意味着它清除了Local
集合。如果它在数据库中发现了一个新实体(具有一个新的键值),则该实体将被添加到Local
集合中(然后显示11项)。但是查询永远不会从Local
中删除项目
重新启动WebAPI项目后,为什么dbset.Local不是空的,我
可以停止调试,去喝杯咖啡,然后重新启动调试
本地收藏中还有20件物品吗
试试10杯咖啡:)工作进程可能会在长时间不活动后自动关闭。我不知道这需要多长时间,也不知道它是否在IIS Express中发生过
这是我遇到的缓存问题吗?有什么我需要的吗
要在我的项目启动代码中执行此操作,请清除dbset.Local
每次在visual studio中重新启动项目时
是的,这(可能)是一个非常大的问题,因为缓存在Local
集合中的那些实体表明您正在跨多个web请求重用同一上下文实例。当您依赖于Local
以及许多其他问题和异常时(例如,当您附加一个实体时,该实体具有与Local
中已有的实体相同的密钥,等等),这可能会导致错误的结果。这通常是最佳实践,建议在web请求开始时创建一个新的上下文实例,在处理单个请求时使用它,然后在请求结束时处理它。处理上下文将释放对象进行垃圾收集。下一次请求时,新上下文实例的Local
集合将为空。(这一点以及如何做到这一点(根据con)