From the Documentation
Entity Framework contexts should be added to the services container
using the Scoped
lifetime. 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:
Transient
objects are always different; a new instance is provided to every controller and every service.
Scoped
objects 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?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…