我正在使用正在使用Entity Framework的Web应用程序,已覆盖SaveChanges
方法以允许对数据库所做更改的日志条目。
现在在MSDN上,它声明数据库上下文不是线程安全的。所以我有两个问题。
1)如果我想在线程中创建日志条目,我是否必须为每个线程使用新的DB上下文?
using (var repository = new LoggingRepository(new LoggingDbContext()))
{
((ILoggingRepository)repository).Persist(auditEntries);
}
更新:日志记录数据库是与SaveChanges
覆盖的数据库不同的数据库
2)应用程序是否为通过IIS连接到应用程序的每个用户创建了新的数据库上下文?
答案 0 :(得分:1)
您提供的示例可行。每个传入的请求都将被分配给线程池中的一个线程,并且您的代码将确保DbContext的生命周期被约束到该线程。
编辑:如果日志记录表位于同一个数据库中,您只需将它们添加到已重写的SaveChanges()所在的模型中,并使用当前的DbContext。我还假设您在使用块或IDisposable-aware RequestLifetimeManager中使用原始DbContext ...
答案 1 :(得分:1)
如果我想在线程中创建日志条目,我是否必须为每个线程使用新的DB上下文?
是的,必须在每个帖子中使用新的上下文。这不是因为记录器,而是因为上下文本身。记录器通常是线程安全的(取决于您使用的是什么),因此您可以将记录器的同一实例传递给不同的上下文。
请记住,这是您需要使用线程ID时,因为许多线程将写入相同的日志输出。日志条目没有订单。例如,您可以在日志文件中看到事务中断,这不表示存在问题。这就是日志文件写入的方式。
应用程序是否为通过IIS连接到应用程序的每个用户创建新的数据库上下文?
在大多数情况下,这是正确的方法。此外,您不仅要为每个用户构建新的db上下文,还要为每个新请求构建新的db上下文。数据库上下文使用连接池,它在部署托管连接对象时保留物理连接并销毁逻辑连接。
数据库上下文被设计为轻量级对象。