在Entity Core中调用存储过程时,创建一个新的DbContext或使用注入的DbContext?
问题描述:
在Entity Core中执行存储过程(使用ADO方法)的正确方法是什么?在Entity Core中调用存储过程时,创建一个新的DbContext或使用注入的DbContext?
我应该使用注入的dbcontext还是应该创建一个新的?
public class ContactController
{
private readonly MyDbContext _context;
public ContactController(MyDbContext context)
{
_context = context;
}
public IActionResult Search(ContactSearchModel csm, int page)
{
//execute using the injected _context?
using (var command = _context.Database.GetDbConnection().CreateCommand())
{
//...
}
//or create a new context?
using (var newContext = new MyDbContext())
{
using (var command = newContext.Database.GetDbConnection().CreateCommand())
{
//...
}
}
}
}
答
应该没有任何理由不使用注入的。
如果您只是因为您只是在读取数据而希望快速查询,并且担心跟踪或其他问题,那么在为存储过程调用数据库时应该调用.AsNoTracking()
。
一个例子:
var users = _context.Users
.FromSql("EXECUTE dbo.MyUserStoredProc")
.AsNoTracking()
.ToList();
参见Raw SQLNo Tracking和这些EF核心的文档。
使用注入的,而不是创建一个新的。优点:您可以在SaveChanges上使用相同的事务,以及在保留请求的工作单元的上下文时可以执行的其他修改。 – jannagy02