![](/img/trans.png)
[英]EF 4: How to properly update object in DbContext using MVC with repository pattern
[英]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.