Изолировать изменения в EF Core - PullRequest
0 голосов
/ 10 октября 2018

Вот как я могу добавить службу DbContext при запуске ядра ASP.NET:

services.AddDbContextPool<AppDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

services.AddScoped<ClassA, ClassA>();
services.AddScoped<ClassB, ClassB>();

ClassA - Method1

_dbContext.EntityX.Add(new EntityX { ... });

var product = ClassB.GetProduct(key);

_dbContext.EntityY.Add(new EntityY { Product = product });

_dbContext.SaveChanges();

ClassB - GetProduct

//Check product if it exists in the database
//Else, get details of the product from a Web API

var newProduct = new Product{ ... }
_dbContext.Products.Add(newProduct );

_dbContext.SaveChanges();

return newProduct;

Я буду честен и скажу вам, что я еще не пробовал запускать эти коды, для краткости они сокращены (в значительной степени) до версии реального кода.

Мои вопросы:

1) У меня есть одинаковые DbContext в ClassA и ClassB?Это гарантировано?

2) Если оба ClassA и ClassB имеют одинаковое DbContext, SaveChanges в ClassB повлияет на EntityX, добавленное в ClassA?

3) Что я должен сделать, чтобы изолировать изменения в ClassA и ClassB?

1 Ответ

0 голосов
/ 10 октября 2018

У меня есть одинаковые DbContext в ClassA и ClassB?Это гарантировано?

Контекст базы данных зарегистрирован как зависимые области, это означает, что экземпляр используется совместно при обработке одного входящего запроса.Каждый запрос получит свою собственную область внедрения зависимостей, поэтому в одном запросе вы гарантированно получите такой же экземпляр контекста базы данных.

С другой стороны, вы также гарантированно получитеотдельные контексты базы данных для отдельных запросов.

Если и ClassA, и ClassB имеют одинаковый DbContext, то SaveChanges в ClassB повлияет на EntityX, добавленный в ClassA?

Краткий ответ: да.Поскольку это единый контекст базы данных, существует также одна совокупность отслеживаемых объектов.Поэтому, если вы сначала запустили ClassA.Method1 и у вас там не было вызова SaveChanges, а затем запустили ClassB.Method2, SaveChanges() в последнем также сохранит изменения из первого метода.

Хотяэто может показаться проблематичным, на практике это обычно не так: запрос обычно обрабатывается как часть действия контроллера, поэтому существует очень четкий поток управления.Таким образом, параллельной обработки не существует, и до тех пор, пока вы всегда «очищаете» контекст после его использования (например, вызывая SaveChanges()), проблем не будет.

С другой сторонывы также можете использовать это в своих интересах и обмениваться транзакциями в процессе обработки вашего запроса, при этом ваши методы не будут знать, что они являются частью транзакции.

Что я должен сделать, чтобы изолировать изменения в ClassAи ClassB?

Подумайте, действительно ли вам нужна изоляция.Единственный способ, которым ваш Method2 может повлиять на Method1, - это когда Method1 внес изменения в объекты, которые не были сохранены.И если вы делаете это, то, скорее всего, вы все равно злоупотребляете своими сущностями.Обычно метод должен завершать свою работу с сущностями, не оставляя грязного состояния позади.

...