C# 在ASP.NET Core中处理ApplicationDbContext

C# 在ASP.NET Core中处理ApplicationDbContext,c#,entity-framework-core,C#,Entity Framework Core,我有一个web应用程序,并将其托管在Azure中,但问题是SQL池很快就满了,不管是哪层。 我在想也许我需要处理ApplicationDbContext,这是必需的吗?这有帮助吗 下面是我的类的一部分,方法索引利用了大部分SQL时间: private readonly ApplicationDbContext _context; private readonly IEmailSender _emailSender; public MessagesController(ApplicationDb

我有一个web应用程序,并将其托管在Azure中,但问题是SQL池很快就满了,不管是哪层。 我在想也许我需要处理ApplicationDbContext,这是必需的吗?这有帮助吗

下面是我的类的一部分,方法索引利用了大部分SQL时间:

private readonly ApplicationDbContext _context;
private readonly IEmailSender _emailSender;

public MessagesController(ApplicationDbContext context, IEmailSender emailSender)
{
    _context = context;
    _emailSender = emailSender;
}

// GET: Message
[Authorize]
public async Task<IActionResult> Index()
{
    var user = _context.Users.Where(u => u.Email.Equals(User.Identity.Name)).Select(u =>
    new { u.Name, u.Subdomain, u.PhotoURL }).FirstOrDefault();
    ViewData["Name"] = user.Name;
    ViewData["Subdomain"] = user.Subdomain;
    ViewData["PhotoURL"] = (user.PhotoURL == null) ? "../../img/avatar.png" : user.PhotoURL;
    List<Message> messages = await _context.Messages.Where(m => m.UserName.Equals(User.Identity.Name))
    .Select(m => new Message { ID = m.ID, DateTime = m.DateTime, Text = m.Text }).ToListAsync();
    return View(messages);
}
private readonly ApplicationDbContext\u上下文;
私人只读IEmailSender\u emailSender;
公共消息控制器(ApplicationDbContext上下文,IEmailSender emailSender)
{
_上下文=上下文;
_emailSender=emailSender;
}
//获取:消息
[授权]
公共异步任务索引()
{
var user=_context.Users.Where(u=>u.Email.Equals(user.Identity.Name))。选择(u=>
新的{u.Name,u.Subdomain,u.PhotoURL}).FirstOrDefault();
ViewData[“Name”]=user.Name;
ViewData[“子域”]=用户。子域;
ViewData[“PhotoURL”]=(user.PhotoURL==null)?“../../img/avatar.png”:user.PhotoURL;
List messages=wait_context.messages.Where(m=>m.UserName.Equals(User.Identity.Name))
.Select(m=>newmessage{ID=m.ID,DateTime=m.DateTime,Text=m.Text});
返回视图(消息);
}

尽管我在其他ActionResult方法中使用相同的上下文,但我是否应该调用_context.dispose()?

否,您不必调用_context.dispose()-IoC容器将根据注册资源时使用的生存期设置释放资源

更重要的是,您写道“我在其他ActionResult方法中使用相同的上下文?”。那不是真的——至少它不应该是真的。应该为每个请求创建上下文。因此,在调用每个控制器操作时,您正在生成新请求,而容器正在创建要注入的新上下文(每次完成新请求时,控制器都会再次创建)

以下是您应该如何注册您的上下文:

services.AddDbContext<SchoolContext>(options => options.UseSqlServer(CONNECTION_STRING));
services.AddDbContext(options=>options.UseSqlServer(CONNECTION_STRING));

这样,您将使用DbContext范围的默认生存期。

谢谢您的回答。我已经做了你们上面写的,我应该把它附在使用声明中吗?因为我还是不明白为什么我的游泳池很快就满了。如果我对上面的代码有任何问题,你能告诉我吗?