2

我正在开发一个使用实体框架的 Web 应用程序,该SaveChanges方法已被覆盖以允许对数据库所做的更改的日志条目。

现在在MSDN上,它声明数据库上下文不是线程安全的。所以我有2个问题。

1)如果我想在一个线程中创建日志条目,我必须为每个线程使用一个新的数据库上下文吗?

using (var repository = new LoggingRepository(new LoggingDbContext()))
{
    ((ILoggingRepository)repository).Persist(auditEntries);
}

更新:日志数据库是一个独立的数据库,与SaveChanges被覆盖的数据库不同

2) 应用程序是否为通过 IIS 连接到应用程序的每个用户创建一个新的 DB 上下文?

4

2 回答 2

1

如果我想在线程中创建日志条目,是否必须为每个线程使用新的数据库上下文?

是的,您必须在每个线程中使用新的上下文。这不是因为记录器,而是因为上下文本身。记录器通常是线程安全的(取决于您使用什么),因此您可以将记录器的相同实例传递给不同的上下文。

请记住,这是您需要使用线程 ID 的时候,因为许多线程将写入相同的日志输出。日志条目将没有顺序。例如,您可以在日志文件中看到事务中断,这并不表示存在问题。这只是日志文件的写入方式。

应用程序是否为通过 IIS 连接到应用程序的每个用户创建新的数据库上下文?

在大多数情况下,这是正确的方法。此外,您不仅应该为每个用户构建新的数据库上下文,还应该为每个新请求构建新的数据库上下文。DB Context 使用连接池,当托管连接对象被释放时,它保留物理连接并破坏逻辑连接。

数据库上下文被设计为一个轻量级对象。

于 2013-11-08T12:54:26.970 回答
1

您提供的示例将起作用。每个传入的请求都将被分配给线程池中的一个线程,并且您的代码将确保 DbContext 的生命周期被限制在该线程中。

编辑:如果日志记录表在同一个数据库中,您可以简单地将它们添加到您覆盖的 SaveChanges() 所在的模型中并使用当前的 DbContext。我还假设您在 using 块内或 IDisposable-aware RequestLifetimeManager 下使用原始 DbContext ...

于 2013-11-08T12:50:40.473 回答