У меня возникли проблемы с поиском способа работы этого шаблона хранилища.
В двух словах, мое решение выглядит примерно так ...
ASP.Net MVC
^
|
Business Logic
^
|
Data Access
(Repositories and Unit of Work)
^
|
Entity Framework Models
Iу меня есть таблица Users со ссылкой на таблицу Roles.
В моем приложении MVC я вызываю BLL с помощью GetAllUsers.Код в BLL выглядит следующим образом:
public List<User> GetAllUsers()
{
using (UnitOfWork uow = new UnitOfWork())
{
UserRepository userRepository = new UserRepository(uow);
return userRepository.GetAll().ToList();
}
}
UserRepository является производным от GenericRepository, который имеет GetAll ()
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
private IUnitOfWork _uow = null;
public GenericRepository(IUnitOfWork uow)
{
_uow = uow;
}
public virtual IQueryable<T> GetAll()
{
return _uow.Set<T>().AsQueryable();
}
}
. Он возвращает список пользователей в мое приложение MVC,но когда я пытаюсь получить доступ к ссылке на роль, она еще не загружена из-за отложенной загрузки.
public ActionResult Index()
{
BusinessLogic.Account blAcct = new BusinessLogic.Account();
List<User> users = blAcct.GetAllUsers();
string firstName = users.FirstName; // Works fine
string role = users.Roles.RoleName; // Fails because the context is closed.
return View();
}
Я пытался поместить .Include (Roles) в GetAllUsers, но .Include isnнедоступно в IQueryable.
Теоретически, правильно ли я считаю, что приложению MVC не нужно ничего знать о контексте или доступе к данным?И во-вторых, как мне включить эту ссылку Роли в мой график, прежде чем он покинет BLL?