NHibernate:修改收集;枚举操作不能执行
我目前正在努力解决这个“集合被修改;枚举操作可能无法执行”的问题 我已经搜索了这个错误消息,它都与foreach语句有关。我确实有一些foreach语句,但它们只是简单地表示数据。我没有在foreach语句中使用任何删除或添加 注:NHibernate:修改收集;枚举操作不能执行,nhibernate,Nhibernate,我目前正在努力解决这个“集合被修改;枚举操作可能无法执行”的问题 我已经搜索了这个错误消息,它都与foreach语句有关。我确实有一些foreach语句,但它们只是简单地表示数据。我没有在foreach语句中使用任何删除或添加 注: 错误会随机发生(大约每天4-5次) 该应用程序是MVC网站 大约有5个用户操作此应用程序(每天约150个订单)。是否可能是其他用户修改了集合,然后出现此错误 我有log4net设置,可以找到设置 确保控制器具有无参数公共构造函数我在AdminProductContr
在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,布尔值&同步完成)Oskar是正确的。两个单独的线程试图同时初始化会话工厂。建议您对初始化代码进行一些锁定,可能只是使用
lock
关键字和合适的同步对象。我们使用了如下模式,使用Wintellect PowerThreading库中的一个锁:
using (_lock.WaitToRead())
{
if (Factory != null) return Factory;
}
using (_lock.WaitToWrite())
{
if (Factory != null) return Factory;
Factory = ConfigureFactory();
return Factory;
}
您可以更简单地使用lock
关键字和双重检查锁定模式,如下所示:
class NestedSessionManager
{
internal static SessionManager _sessionManager;
private static readonly object _syncRoot = new object();
internal static SessionManager sessionManager
{
get
{
if (_sessionManager != null) return _sessionManager;
lock (_syncRoot)
{
if (_sessionManager != null) return _sessionManager;
_sessionManager = new SessionManager();
return _sessionManager;
}
}
}
}
嗨,大卫,我已经添加了代码示例。我想我正在从log4net细节构建多次配置。你能给我一些建议吗?谢谢。控制器中的构造函数怎么样?你能发布吗?嗨,大卫,控制器示例代码已经包含在内了。非常感谢。嗨,大卫,我怎样才能在现有代码中实现锁呢?你能给我提供一个样品吗?非常感谢。大卫。我现在知道如何使用lock关键字了。:)