我正在开发一个使用 Entity Framework 的 Web 应用程序,SaveChanges
方法已被覆盖以允许记录对数据库所做更改的条目。
现在 MSDN它声明数据库上下文不是线程安全的。所以我有 2 个问题。
1) 如果我想在一个线程中创建日志条目,我是否必须为每个线程使用一个新的数据库上下文?
using (var repository = new LoggingRepository(new LoggingDbContext()))
{
((ILoggingRepository)repository).Persist(auditEntries);
}
更新:日志数据库是一个独立于SaveChanges
被覆盖的数据库
2) 应用程序是否为通过 IIS 连接到应用程序的每个用户创建一个新的数据库上下文?
最佳答案
If I want to create the log entries in a thread do I have to use a new DB Context for each thread?
是的,您必须在每个线程中使用新上下文。这不是因为记录器,而是因为上下文本身。记录器通常是线程安全的(取决于您使用的是什么),因此您可以将记录器的相同实例传递到不同的上下文。
请记住,这是您需要使用线程 ID 的时候,因为许多线程将写入相同的日志输出。日志条目将没有顺序。例如,您可以在日志文件中看到事务中断,这并不表示有问题。这就是写入日志文件的方式。
Does the application create a new DB Context for each user that connects to the application through IIS?
在大多数情况下,这是正确的方法。此外,您不仅应该为每个用户构建新的数据库上下文,还应该为每个新请求构建新的数据库上下文。 DB Context 使用连接池,它保留物理连接并在处置托管连接对象时销毁逻辑连接。
数据库上下文被设计成一个轻量级对象。
关于c# - 具有数据库连接的 IIS Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859485/