Простой способ состоит в том, чтобы иметь один DbContext для каждого запроса, ASP.NET MVC выполняет всю безопасность потоков, каждый экземпляр контроллера в ASP.NET MVC изолирован для каждого запроса, вы не приходится беспокоиться о состоянии гонки. Пока вы не создаете потоки и просто выполняете преобразование данных в методе действий с использованием одного DbContext, у вас не будет проблем.
В основном DbContext ничего не делает, он просто ставит запрос SQL в целевую базу данных, это база данных, которая обрабатывает многопоточность, условия гонки. Чтобы защитить ваши данные, вы должны использовать транзакции и добавлять проверки в базе данных, чтобы убедиться, что они будут сохранены правильно
public abstract class DbContextController : Controller{
public AppDbContext DB { get; private set;}
public DbContextController(){
DB = new AppDbContext();
}
protected override void OnDisposing(bool disposing){
DB.Dispose();
}
}
Если вы унаследовали любой класс из DbContextController
и использовать БД в течение всей жизни контроллера, вы не будете иметь любая проблема.
public ActionResult ProcessProducts(){
foreach(var p in DB.Products){
p.Processed = true;
foreach(var order in p.Orders){
order.Processed = true;
}
}
DB.SaveChanges();
}
Однако, если вы используете какую-либо тему, как в следующем примере,
public ActionResult ProcessProducts(){
Parallel.ForEach(DB.Products, p=>{
p.Processed = true;
// this fails, as p.Orders query is fired
// from same DbContext in multiple threads
foreach(var order in p.Orders){
order.Processed = true;
}
});
DB.SaveChanges();
}
Если вы хотите сделать все это за одну транзакцию, тогда один DbContext будет в порядке. Не нужно беспокоиться о безопасности потоков, хотя вам нужно будет делать все ваши операции последовательно. – DavidG
@DavidG: Но что, если 2 пользователя попытаются использовать один и тот же DbContext одновременно? Не будет ли причиной гонки? – Idov
Вы никогда не должны допускать, чтобы это произошло. DbContext не предназначен для использования таким образом и будет делать некоторые очень странные вещи, если вы попытаетесь! – DavidG