在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()) 
      { 
       //... 
      } 
     } 

    } 
} 
+0

使用注入的,而不是创建一个新的。优点:您可以在SaveChanges上使用相同的事务,以及在保留请求的工作单元的上下文时可以执行的其他修改。 – jannagy02

应该没有任何理由不使用注入的。

如果您只是因为您只是在读取数据而希望快速查询,并且担心跟踪或其他问题,那么在为存储过程调用数据库时应该调用.AsNoTracking()

一个例子:

var users = _context.Users 
    .FromSql("EXECUTE dbo.MyUserStoredProc") 
    .AsNoTracking() 
    .ToList(); 

参见Raw SQLNo Tracking和这些EF核心的文档。