From the Documentation
Entity Framework contexts should be added to the services container using the
Scopedlifetime. This is taken care of automatically if you use the helper methods as shown above. Repositories that will make use of Entity Framework should use the same lifetime.
I always thought, that I should create a new Context for every single unit of work I have to process. This let me think, if I have a ServiceA and ServiceB, which are applying different actions on the DbContext that they should get a different Instance of DbContext.
The documentation reads as following:
Transientobjects are always different; a new instance is provided to every controller and every service.
Scopedobjects are the same within a request, but different across different request
Going back to ServiceA and ServiceB, it sounds to me, Transient is more suitable.
I have researched, that the Context should only saved once per HttpRequest, but I really do not understand how this does work.
Especially if we take a look at one Service:
using (var transaction = dbContext.Database.BeginTransaction())
{
//Create some entity
var someEntity = new SomeEntity();
dbContext.SomeEntity.Add(someEntity);
//Save in order to get the the id of the entity
dbContext.SaveChanges();
//Create related entity
var relatedEntity = new RelatedEntity
{
SomeEntityId = someEntity.Id
};
dbContext.RelatedEntity.Add(relatedEntity)
dbContext.SaveChanges();
transaction.Commit();
}
Here we need to Save the context in order to get the ID of an Entity which is related to another one we just have created.
At the same time another service could update the same context. From what I have read, DbContext is not thread safe.
Should I use Transient in this case? Why does the documentation suggest, I should use Scoped?
Do I miss some important part of the framework?