Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq到SQL-更新后脏读-WCF服务_Wcf_Web Services_Linq To Sql - Fatal编程技术网

Linq到SQL-更新后脏读-WCF服务

Linq到SQL-更新后脏读-WCF服务,wcf,web-services,linq-to-sql,Wcf,Web Services,Linq To Sql,我有一个dbml文件(linq到sql)连接到我的数据库。我有一个使用通用存储库(针对每个实体)与dbml对话的经理。经理使用回购进行工作(CRUD操作)。WCF包装管理器并将其公开给外部世界(以便我的应用程序可以使用它) DB IRepositoryIManager(IRepo,IRepo…)WCFService(IManager) 我测试过经理,每次都很好。问题在于WCF。我将读取数据(例如GetAllLocations),更新数据(例如更改位置名称),但稍后在某个随机点,我将读取脏数据。例

我有一个dbml文件(linq到sql)连接到我的数据库。我有一个使用通用存储库(针对每个实体)与dbml对话的经理。经理使用回购进行工作(CRUD操作)。WCF包装管理器并将其公开给外部世界(以便我的应用程序可以使用它)

DB IRepositoryIManager(IRepo,IRepo…)WCFService(IManager)

我测试过经理,每次都很好。问题在于WCF。我将读取数据(例如GetAllLocations),更新数据(例如更改位置名称),但稍后在某个随机点,我将读取脏数据。例如,如果我一直在将位置名称从“BC 1”更改为“BC 2”,再更改为“BC 3”,有时我会读取它并获取旧值。就像在我把它改成“bc3”并且我希望读“bc3”之后,我得到了“bc1”(这没有意义,因为更新之前的值是“bc2”)。WCF默认情况下没有缓存,那么为什么在我的WCF上而不是在我的manager上发生这种情况呢?WCF所做的只是将值传递给管理器并从管理器获取值,这是一个非常基本的包装器类

注意:我使用StructureMap自动解析DependencyInjection和IoC内容

问题方法:正在读取的任何内容(例如GetLocationById和GetAllLocations)。它们并不总是从数据库返回最新的数据。我知道这不是manager,因为我创建了一个简单的项目来分别测试manager和WCF,只有WCF在更新数据(特别是位置)后有脏读。我还没有测试所有其他实体

最后一点注意:我一直得到“System.Data.Linq.ChangeConflictException:Row not found或changed.”异常。我将DBML设计器位置实体的属性(PK除外)更改为更新Check:Never。无论如何,脏读都发生在这个更改之前,并且管理器工作正常(并且它使用DBML)。所以我没有理由相信这是导致肮脏阅读的原因


此外,Location实体在数据库中有一个触发器,但我排除了这一原因,因为我禁用了它,这没有任何帮助,而且管理器再次正常工作。

有两个因素可能导致此问题:

  • 环境事务范围的隔离级别可能不同
  • WCF的一个不同之处是,通过IIS可能会导致事情并发运行
您可以尝试以下几点:

  • 设置事务作用域的隔离级别
  • 确保您的连接字符串启用MARS-多个活动结果集

原来这是由于使用WCF和结构映射而导致的缓存问题。在数据注册表中注册数据上下文时,我更改了默认结构映射缓存

For<MyDataContext>()
   //.HybridHttpOrThreadLocalScoped()
   .Use(() => new MyDataContext());
() //.HybridHttpOrthReadLocalScope()文件 .使用(()=>newmydatacontext());
默认值是每次调用,这正是我所需要的。

您建议将隔离级别设置为什么?我尝试将其设置为ReadCommitted,但在本地计算机上安装后无法启动该服务。我尝试在dbml连接字符串上启用MARS,但没有任何帮助。ReadCommitted是停止脏读的最低级别。您的服务在使用时无法启动,这表明存在其他问题。你会犯什么错误?检查事件日志感谢您的帮助,我解决了它(这是一个结构映射缓存问题,只有在使用WCF时才变得明显)。