Asp.net web api webAPI+;EF5数据库集包含的本地实体即使在visual studio中重新启动webAPI项目后也不在数据库中

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

我一直在学习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个项目)

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)