C# 在高负载Web应用程序中正确使用实体框架

C# 在高负载Web应用程序中正确使用实体框架,c#,entity-framework,asp.net-mvc-4,architecture,C#,Entity Framework,Asp.net Mvc 4,Architecture,通常情况下,与EF一起为an进行的工作如下所示: using (var ctx = new EntityContext()) { ... return something; } 某些Web控制器调用具有以下内容的方法: using (var ctx = new EntityContext()) { ... return something; } 但我猜在高负载的应用程序中,每分钟有数千个请求,这可能会产生问题。 所以我的问题是:手动打开连接并使其保持活动状态是

通常情况下,与EF一起为an进行的工作如下所示:

using (var ctx = new EntityContext())
{
    ...
    return something;
}
某些Web控制器调用具有以下内容的方法:

using (var ctx = new EntityContext())
{
    ...
    return something;
}
但我猜在高负载的应用程序中,每分钟有数千个请求,这可能会产生问题。 所以我的问题是:手动打开连接并使其保持活动状态是否有意义? 如果是,任何人都可以为这样的任务共享适当的代码吗


提前感谢

不,不要试图让打开的连接保持活动状态。这就是行不通,明白吗

您正在构建一个ASP.Net MVC应用程序,因此在本用例中使用Entity Framework所遵循的模式非常简单:为每个新控制器实例实例化一个新上下文(例如使用依赖项注入)。当为每个用户请求创建一个新的控制器实例时,您将为每个请求创建一个新的新EF上下文,这是非常理想的

不要担心创建大量上下文实例,由于连接池,它不会每次都创建新的DB连接

如果您希望应用程序具有可伸缩性,那么最好的选择是,如果您的Entity Framework版本支持异步模式,那么还可以使用异步模式。看

编辑:
查看。

使用元素关闭
标记后,它会自动关闭连接。所以你不想担心。但如果您真的想手动打开连接,请尝试以下操作(我无法测试它。可能您需要提供连接设置)


谢谢你的回答。我还有一个问题:当几个控制器实例(不同用户的)试图更新数据库中的同一记录时,我应该如何处理EF中的情况?哪种类型的事务更适合使用?(serializable不是最佳选项)以及我应该在代码中锁定什么:整个dbcontext?@J.Doe这是并发控制系统的角色。有几种可用的模式,例如。基本上,当您尝试更新数据库中的某些内容时,EF会查询数据并确保其仍处于与以前相同的状态。通常,在表中添加一列(例如上次行更新的时间戳),EF将检查此值在加载实体的时间和尝试更新的时间之间是否没有变化。尽量避免锁。我读了你提到的文章,但现在我更困惑了。我不确定使用哪种方法:db wins、client wins或其他任何方法……正如我前面提到的,我有一个请求池,我在任务(多线程)中实现这些请求,因此可能有几个线程将在数据库的同一记录上工作,在这种情况下,我不确定哪种方法是最好的