У меня есть приложение ASP.NET MVC 3, и в моем проекте я использую модель данных объекта ADO.NET.
Для доступа к данным я использую промежуточный класс (DataManager):
public class DataManager
{
private static mrhomeEntities _dataContext;
public DataManager()
{
_dataContext = new mrhomeEntities();
}
private OptionStorageRepository _optionStorageRepository;
public OptionStorageRepository OptionStorage
{
get { return _optionStorageRepository ?? (_optionStorageRepository = new OptionStorageRepository(_dataContext)); }
}
}
В классе OptionStorageRepository у меня есть 1 метод, который возвращает список параметров:
public IQueryable<OptionStorage> List()
{
return _dataContext.OptionStorage;
}
Таких классов у меня более 15 (с такой структурой) для получения и редактирования данных в базе данных.
Тем не менее, у меня есть ControllerFabrick, где я передаю новый объект класса DataManager:
public class ControllerFabricFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return Activator.CreateInstance(controllerType, new DataManager()) as IController;
}
}
Также я зарегистрировал свой фабричный контроллер в Global.asax так:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
ControllerBuilder.Current.SetControllerFactory(new ControllerFabricFactory());
}
И во всех контроллерах я получаю этот параметр в конструкторе и использую в своих действиях методы:
public class HomeController : Controller
{
private readonly DataManager dm;
public HomeController(DataManager dm)
{
this.dm = dm;
}
[HttpGet]
public ActionResult Main()
{
Page page = dm.Page.Details(mainPageName);
PageNews pageNews = new PageNews();
pageNews.page = page;
pageNews.NewsList = dm.News.List(5);
pageNews.PopularProject = dm.Project.GetPopularProject();
if (pageNews.PopularProject != null)
{
var list = pageNews.PopularProject.ProjectPictures.Where(p => p.ProjectPictureTypes.Id == 1).ToList();
if (list.Count > 0)
{
ViewData["img"] = list[0].ThumbPath;
}
}
foreach (var item in dm.Page.List())
{
ViewData[item.Name] = item.ShortPageText;
}
ViewData["projects"] = dm.Project.GetMainPageProjects();
ViewData["MainText"] = dm.Page.Details("maintext").PageText;
return View(pageNews);
}
}
И мой вопрос:
Когда я тестирую свое приложение в веб-браузере, у меня появляются странные ошибки, которые содержат информацию о подключении к базе данных или получении данных, у меня есть коллекция моих ошибок ниже:
- Соединение не было закрыто. Текущее состояние соединения
подключение.
- Недопустимая попытка чтения при отсутствии данных
- ExecuteReader требует открытого и доступного соединения.
текущее состояние соединения открыто.
- Новая транзакция не разрешена, потому что есть другие потоки
работает в сеансе.
- Элемент с таким же ключом уже добавлен.
Может быть, я использовал неправильную структуру для получения данных?