【发布时间】:2011-08-18 02:14:33
【问题描述】:
当多个用户访问同一页面时,我在 ASP.NET 4 网站上收到以下错误消息:
基础提供程序未能打开。在 System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf 等等……
我使用 Entity Framework 4 来访问 SQL Server 2008 数据库。
该页面有时会工作,所以我知道连接字符串是正确的。此外,数据库设置为多用户,我在连接字符串中将 MARS 设置为 true。
在事件查看器中,我有时会收到 SQL Server 消息:
服务器将断开连接,因为客户端驱动程序有 在会话处于单用户模式时发送多个请求。
正如我所说,只有当我尝试通过刷新页面或单击同一链接在两台不同的机器上同时访问同一页面时才会发生这种情况。
任何帮助将不胜感激。
添加了连接字符串(第一个用于 ASPNETDB,第二个用于主数据库):
<add name="ApplicationServices" connectionString="Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;Persist Security Info=False;User ID=****;Password=****;Connect Timeout=120" />
<add name="MyDBEntities" connectionString="metadata=res://*/App_Code.MyDBModel.csdl|res://*/App_Code.MyDBModel.ssdl|res://*/App_Code.MyDBModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=MyServer;Initial Catalog=MyDB;Integrated Security=False;User ID=****;Password=****;Connect Timeout=120;User Instance=false;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
我用来访问上下文的类如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using MyDBModel;
using System.Web.Security;
/// <summary>
/// Summary description for MyDataAccess
/// </summary>
public static class MyDataAccess
{
// Private Class Members
//-----------------------------------------------------------------------------------------
private static MyDBModel.MyDBEntities dal = new MyDBModel.MyDBEntities();
// Class Constructor / Destructor
//-----------------------------------------------------------------------------------------
static MyDataAccess()
{
// Set Entity ObjectContext Merge Options - this basically ensures database items aren't cached
dal.NEWS.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges;
dal.NEWS_IMAGES.MergeOption = System.Data.Objects.MergeOption.OverwriteChanges;
}
// Public Methods for Data Access
//-----------------------------------------------------------------------------------------
/// <summary>
/// Get All Current News Items
/// </summary>
public static List<NEWS> GetCurrentNewsItems()
{
var items = from news in dal.NEWS
where news.NEWS_ACTIVE == true &&
news.NEWS_STARTDATE <= DateTime.Today &&
news.NEWS_EXPIRYDATE >= DateTime.Today
orderby news.NEWS_DATE descending
select news;
return NewsManager.GetMyNewsItems(items).ToList();
}
}
然后在我的 .aspx.cs 页面中,我会使用如下内容:
var news = MyDataAccess.GetCurrentNewsItems();
【问题讨论】:
-
如何处理对象上下文的生命周期?您必须为每个请求创建一个新的上下文实例。
-
是的,我每次需要访问数据库时都会创建一个新的上下文。另外据我所知,EF 框架处理连接的打开和关闭。
-
您是否使用任何代码将您的数据库更改为单用户模式?显示您的连接字符串。
-
你能展示你创建/管理对象上下文的代码吗?
-
现在已经在上面的原始帖子中添加了代码和连接字符串。
标签: asp.net sql-server entity-framework-4