Я получаю следующее сообщение об ошибке на веб-сайте 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();