c# - 具有数据库连接的 IIS Web 应用程序

标签 c# multithreading entity-framework iis

我正在开发一个使用 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/

相关文章:

python - 不能用pythonw调用qwinsta

c - fatal error : thread. h:没有那个文件或目录

.net - 一旦线程加入,如何通知线程停止等待互斥体?

c# - 当任何值由另一个 Observable 产生时,选择 Observable 的最新值

c# - 当我们将字符串变量作为 ref 参数传递给函数并在函数中更改字符串变量的值时

c# - BulkInsert - 空间 'CSSpace' 没有关联的集合

c# - 如何使用 Entity Framework Code First 映射非公共(public) Collection 属性?

c# - 如何使用 AutoMapper 将目标对象映射到源对象中的子对象?

c# - Entity Framework 中相同类型的多个集合

c# - 使用 Entity Framework Code First 版本 5 中的 SQL View