C# OptimisticConcurrencyException:使用共享AppFabric缓存和相同数据库的多个基于EF的应用程序
我在与Appfabric相同的计算机上使用web应用程序和windows服务。 两个应用程序都重用相同的DAL代码(dll),该代码首先基于EF(实体框架)代码,并访问Appfabric中的相同缓存。windows服务中的代码作为作业实现,作为 web应用程序必须支持多个非正常请求,windows服务必须支持多个线程(调度程序和事件)。 对于这两种情况,共享DAL dll会为每个http会话和线程ContextID创建一个DbContext对象,或者仅为后者创建一个线程ContextID。DAL使用来自的EFCachingProviders。此外,我的EF解决方案在映射中使用带有时间戳列和IsRowVersion的乐观并发 如上所述,拥有二级缓存的好处是可以跨进程访问原始状态的表示!但这似乎对我不起作用,在我的用例中,我得到“OptimisticConcurrencyException”,如下所示:C# OptimisticConcurrencyException:使用共享AppFabric缓存和相同数据库的多个基于EF的应用程序,c#,entity-framework,caching,appfabric,second-level-cache,C#,Entity Framework,Caching,Appfabric,Second Level Cache,我在与Appfabric相同的计算机上使用web应用程序和windows服务。 两个应用程序都重用相同的DAL代码(dll),该代码首先基于EF(实体框架)代码,并访问Appfabric中的相同缓存。windows服务中的代码作为作业实现,作为 web应用程序必须支持多个非正常请求,windows服务必须支持多个线程(调度程序和事件)。 对于这两种情况,共享DAL dll会为每个http会话和线程ContextID创建一个DbContext对象,或者仅为后者创建一个线程ContextID。DAL
private void InvalidateCache()
{
try
{
DataCache myCache = ...
foreach (String region in myCache.GetSystemRegions())
{
myCache.ClearRegion(region);
}
}
catch (Exception ex)
{
eventLog.WriteEntry("InvalidateCache exception : " + ex.Message);
}
}
我没有答案,但我希望下面的想法能为你指明正确的方向 如果这只是更新的问题,我会在数据库的每次更新中读取一个新的记录实例,并对其进行更新。这将避免乐观并发错误。请注意,DbContext不是线程安全的——我不知道这是否会导致问题,但每次阅读新内容都会解决这个问题
如果您在读取时遇到此问题,那么您必须跟踪各种缓存的位置、哪些缓存没有得到更新以及原因。我猜在每个使用点都有不同的缓存配置选项。祝你好运……) 谢谢你的评论。关于更新,我添加了一个更新我如何修复它。此外,在更新新实例之前读取新实例与乐观并发的整体思想背道而驰。那么row version列就没有额外的好处了。您只想在没有其他人同时更新对象时更新它。。。关于rea