如何使用Entity Framework和Repository Pattern加载相关实体

时间:2011-10-27 14:17:37

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4

此问题与this

有关
  1. 我决定更改Generic Repository模式,并为每个实体使用特定的存储库。但是我只是无法找到如何使它工作,因为在我的HTML中我需要显示相关实体的一些字段。

  2. 用Iqueryable替换Ienumerable是否更好?

  3. 存储库接口

     public interface IApplicantPositionRepository : IDisposable
        {
            IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId);
                       void Save();
        }
    

    存储库接口实现。

    public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId)
            {
                return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId);
            }
    

    控制器方法

    public ViewResult History(int applicantId, int positionId)
            {
                var history=applicantPositionRepository.GetApplicationPositionHistories(applicantId, positionId);
                return View(history);
            }
    

    HTML。

    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.applicantPosition.Position.name)
            </td>
    

2 个答案:

答案 0 :(得分:0)

我个人喜欢IList&lt; T&gt;但这当然是个人选择

要简单地包含一个相关的表(这个不使用RelatedEntityName的字符串的语法,如.Include(“RelatedEntityName”)我认为如果我没记错的话,就会在4.1中添加:

 return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o=>o.RelatedEntityName);

永远不要从存储库返回IQueryable。它不容易测试,因为这是特定于提供商的。

我还会创建单独的方法如果调用者也不需要其他详细信息。

答案 1 :(得分:0)

回答你的第二个问题:

绝对最好使用IQueryable而不是IEnumerable。这样做你可以做这样的事情:

Controller:
public ActionResult Index(int page = 1, int pageSize = 10)
{
    IQueryable<Entity> items = repository.GetEntities();

    items = items.ApplyPaging(page, pageSize);

    return View(items);
}

你可以创建一个名为ApplyPaging的IQueryable扩展方法,它看起来像:

public static class QueryableExtensions
{
    public static IQueryable<T> ApplyPaging<T>(this IQueryable<T> source, int page = 1, int pageSize = 10)
    {
        return source.Skip((page - 1) * pageSize).Take(pageSize);
    }
}

如果它是IEnumerable,那么分页可以由客户端而不是正确构建查询的数据库完成。