MVC存储库模式,其中数据将从多个表

时间:2017-07-01 17:05:25

标签: entity-framework model-view-controller repository-pattern

我正在使用MVC 5和EF6开发应用程序。我正在关注Repository设计模式。像往常一样,有一个Generic Repository层,它有一个类型参数GenericRepository<'T'>。存储库包含GetAll函数:

    public virtual List<T> GetAll()
    {
        IQueryable<T> query = _entities.Set<T>();
        return query.ToList();
    }

已从服务层调用此存储库。在服务层中还有一个名为GetAll()的函数。功能如下:

    public List<Student> GetAll()
    {
        return _unitOfWork.StudentRepository.GetAll();
    }

存储库一次处理单个实体。在这个例子中,我只从Student表中检索数据。我的问题是,如果我想从多个表中检索数据,比如学生部门和国家/地区并在视图中显示它,它怎么可能?我的控制器代码如下:

        public ActionResult Index()
        {
            return View(student.GetAll());
        }

我应该如何以及在何处加入“位置”和“州”实体。我还有一个UnitOfWork层。该层就像:

public class UnitOfWork : IUnitOfWork
    {
        private readonly ConnString _context;
        private IGenericRepository<Student> studentRepository;
        private IGenericRepository<Department> departmentRepository;
        private IGenericRepository<Country> countryRepository;

        public UnitOfWork()
        {
            this._context = new ConnString();
        }

        public IGenericRepository<Student> StudentRepository
        {
            get { return this.studentRepository ?? (this.studentRepository = new GenericRepository<Student>(_context)); }
        }

另一个问题是,如果我想在视图中生成下拉列表(例如,部门和国家/地区),我该怎么做?

感谢接受任何帮助。

由于 帕塔

1 个答案:

答案 0 :(得分:0)

首先。存储库模式不包装表。它包装域实体。它们可能存储也可能不存储在单个表中。

对于您的场景,控制器工作是从模型(业务层)获取信息并使其适应视图的要求。

因此我会做这样的事情:

var students = _studentRepos.GetStudentsInSchool(schoolId);
var departmentIds = students.Select(x=>x.DepartmentId).Distinct();
var departments = _departmentRepos.GetAll(departmentIdS);
var countryIds = studens.Select(x=>x.CountryId).Distinct();
var countries = _countryRepos.GetAll(countryIds);

var items = new List<StudentSummaryModel>();
foreach (var student in studens)
{
    var item = new StudentSummaryModel(student);
    item.CountryName = countries.First(x=>x.Id == student.CountryId).Name;
    item.DepartmentName = departments.First(x=>x.Id == student.DepartmentId).Name;
    items.Add(item)
}

return View(items);

代码合理易读,不同的业务领域是分开的。