繁体   English   中英

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

[英]How to not repeat data access rules in .NET MVC3 using EF (Repository pattern)?

我有2对这样的一对多的课程:

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

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

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

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

问题是,EF的工作方式是,由于Parent引用了子代,因此EF在加载父列表时会自动加载子代,但它会变为活动和非活动子代(也不会对子代列表进行排序)。 活动状态的检查仅在子仓库中。

如何限制访问“儿童”的地方重复使用“获取”规则。

我知道我可以修改Parent仓库以检查Child status = Active,但是随后我会在每个有孩子的课程中重复我的逻辑...

编辑:我有一个儿童的存储库类,返回儿童的有序列表:

    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相关的问题,但在我看来,问题确实是存储库的设计错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM