【问题标题】:What Can/Cannot be done inside a Generic repository在通用存储库中可以/不能做什么
【发布时间】:2016-08-06 06:20:59
【问题描述】:

我正在使用实体框架 6 开发 asp.net mvc-5。现在我没有在通用存储库上使用任何类型,就像这里提到的那样:-

Link-1

&

Link-2

现在通用存储库给您一种感觉,您可以以通用方式做所有事情。但是在这两个链接中似乎可以通用的是获取、添加、删除和修改的基本操作,这些操作是内部默认提供的实体框架。所以任何人都可以使用带有 EF-6 和 MVC-5 的通用存储库来解决这些问题:-

1. 使用 Generic repo 真的是一个好方法吗?似乎通用 repo 只会提供 EF 已经提供的内容!

2.假设我有两个父/子(数据中心/区域)对象:-

public class DataCenter
    {

        public int ID { get; set; }
        public string Name { get; set; }
        public byte[] timestamp { get; set; }


        public virtual ICollection<Zone> Zones { get; set; }
    }

 public class Zone
    {


        public int ZoneID { get; set; }
        public string Name { get; set; }
        public int DataCenterID { get; set; }

        public virtual DataCenter DataCenter { get; set; }

    }

现在使用通用存储库,我可以使用相同的通用存储库方法获取、添加、编辑、删除这两个对象。但假设我想检索与特定数据中心相关的所有区域,如下所示:-

var results = entity.DataCenters.SingleOrDefault(a => a.ID == id).Zones.Where(a => a.Name.Contains("1"));

通用存储库也可以支持这样的查询,这样我就可以将查询重新用于其他对象类型(数据中心和区域除外)。例如,有一个通用查询:- 通过 ID 获取父对象,并为其子对象获取名称中包含单词“1”的子对象??如果父母有多个孩子类型怎么办!通用存储库是否支持非通用查询和操作?

【问题讨论】:

  • A) 是的,因为您可以根据需要将 EF 替换为 ServiceStack;在可能的情况下解耦总是好的。 B)是的,原则上您的存储库实现可以为您完成手工工作并从其他表中检索引用的对象。 ServiceStack.OrmLite 可以做到。 github.com/ServiceStack/…
  • @MeirionHughes 现在我不使用 ServiceStack,我只使用 EF-6,所以 EF 是否支持重新使用我上面查询父/子对象的查询?

标签: asp.net-mvc entity-framework entity-framework-6 dbcontext asp.net-mvc-5


【解决方案1】:

我遇到了同样的问题...我首先做了一个特定的存储库,然后我改成了通用的。但我最终不得不编写如此多的特定查询,我决定更改非通用存储库,返回 ToList(我不想要 IQueryable)并使用工作单元模式。现在我觉得我对现状感到满意。

编辑: 通过它的属性查询孩子,也带回父母(这是你想要的吗?):

return await _context.Entity.Include(e => e.Parent)
                            .Where(e => e.SomeProp == someParam)
                            .ToListAsync();

或者,Querychild,使用父级中的某些属性,带回父级:

return await _context.Entity.Include(e => e.Parent)
                                .Where(e => e.Parent.SomeProp == someParam)
                                .ToListAsync();

【讨论】:

  • 所以您的意思是您最终拥有多个使用 Unit 或 work 一起管理的专用存储库?这与我正在遵循的方法相同..但是如果我可以定义一般查询,例如:-通过ID获取父对象并为其子对象获取名称中包含单词的子对象,则您没有回答我的问题“ 1"
  • 只是一个观察:当您使用工作单元方法时,您可以通过 UnitOfWork 查询父级,但我编辑了我的答案。希望对你有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2020-07-09
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多