如何在.NET MVC3中使用EF(存储库模式)不重复数据访问规则



我有两个类,一对多如下:

public class Parent
{
  public virtual List<Child> Children {get; set;}
}

我还在为每个模型使用存储库类,即:

Parent有自己的repo类,该类有一个Get()函数,可以获取Parent的有序列表。

Child还有自己的repo类,它有一个Get()函数,可以获取状态为Active的Children的有序列表。

问题是,EF的工作方式是,由于Parent有对子项的引用,EF在加载父项列表时会自动加载子项,但它会得到活动和非活动的子项(此外,子项列表没有排序)。活动状态的检查仅在子repo中进行。

我如何才能限制重复"获取"规则,以便在访问儿童的任何地方使用。

我知道我可以修改Parent repo,也可以检查Child status=Active,但我会在每个有孩子的类中重复我的逻辑。。。

编辑:我有一个Child的Repository类,它返回一个有序的Children列表:

    public List<Children> GetList()
    {
        IQueryable<Children> query = context.Set<Children>();
        return query.OrderBy(a=>a.Seq).ToList();
    }

当我只需要直接访问孩子们时,这很好。但当我需要获得Parent类时,我使用下面的repo函数:

ParentRepo GetByID:

public Parent GetByID(object id)
    {
        IQueryable<Parent> query = context.Set<Parent>();
        Parent parentModel = context.Parents.Where(a => a.ParentId == (int)id)
            .Select(a => new
            {
                Parent = a,
                Children = a.Children.OrderBy(b => b.Seq)
            }).ToList()
            .Select(q => q.Parent)
            .Single();
        return parentModel;
    }

正如你所看到的,我也不得不在这里订购孩子们(由Seq)。

这是我唯一能想到的让它发挥作用的方法,但它似乎不对。

public Parent GetByID(object id)
    {
        IQueryable<Parent> query = context.Set<Parent>();
        Parent parentModel = context.Parents.Single(a => a.ParentId == (int)id);
        parentModel.Children = childRepo.GetList(id);
        return parentModel;
    }

存储库模式抽象了数据访问层,因此应用程序的其余部分不依赖于DAL实现细节。存储库应根据应用程序需求构建。基本上,您应该从应用程序的角度设计存储库接口,存储库应该返回域/业务对象。

如果我正确理解你在做什么,你就试图围绕EF构建存储库,这会给你带来这种问题。

我可能误解了,这可能只是一个EF相关的问题,但在我看来,问题确实是存储库的错误设计。

相关内容

  • 没有找到相关文章

最新更新