entity-framework - 在没有存储库的 Entity Framework 中可重用查询。如何?

标签 entity-framework repository-pattern unit-of-work

让我说,我得出的结论(经过大量试验)使用 Entity Framework 时的存储库和工作单元是错误的,错误的,错误的和 this says why很好。

但我真的很讨厌那些嵌入式查询。问题是,如果我反对存储库等,我可以把它们放在哪里? (请提供干净的答案,非常感谢示例)。

我刚刚删除了两个项目,其中包含我的存储库、工作单元和与数百个文件的接口(interface),因为无处可寻。我认为很多人,包括我自己,只是加入了 Repository 的潮流,因为这是其他人都在做的事情,但回想起来,我认为这真的是一趟无路可走。

/叹

理查德

最佳答案

你希望把它们放在哪里?你只有几个选择:

  • 让它们在原处并使用自定义扩展方法,query views , 映射数据库 View 或自定义 defining queries定义可重复使用的部分
  • 将每个查询公开为某个单独类的方法。该方法不能暴露 IQueryable并且不能接受Expression as parameter = 整个查询逻辑必须包含在方法中。但这将使您的类(class)涵盖相关方法,就像存储库一样(唯一可以模拟或伪造的方法)。此实现接近于存储过程使用的实现。
  • 您将执行与先前方法相同的操作,但不是将查询放在单独的类中,而是将它们作为静态方法直接放入实体。这可测试性要差得多,因为静态方法不能被模拟代替(它需要更复杂的测试框架)。这是 active record pattern 的一部分每个实体负责将其加载和保存到数据库。

  • 自定义扩展方法示例:
    public static IQueryable<TEntity> GetByName(this IQueryalbe<TEntity> query, string name) 
        where TEntity : IEntityWithName
    {
        return query.Where(e => e.Name == name);
    }
    

    自定义类公开方法的示例:
    public class QueryProvider
    {
        public QueryProvider() {}
    
        public IEnumerable<TEntity> GetByName(IYourContext context, string name)
            where TEntity : IEntityWithName
        {
            return context.CreateObjectSet<TEntity>().Where(e => e.Name == name).ToList();
        }
    }
    

    关于entity-framework - 在没有存储库的 Entity Framework 中可重用查询。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6950433/

    相关文章:

    c# - 使用 LINQ 按层次顺序显示数据

    asp.net-mvc - 处理 "object reference not set to an instance of an object"错误

    c# - 使用 EntityFramework : Context per Presenter or long conversation pattern for Windows Forms Applications?

    c# - 如何使用通用存储库、工作单元模式和多个数据库的多个 EDMX

    database - 是否需要数据库之外的事务行为?

    c# - 如何在 OData v4 API 中拥有动态可查询实体?

    c# - TdsParserStateObject - 处置? Entity Framework

    c# - 存储库测试最大限度地减少重复

    c# - 存储库模式 : How to implement a basic Repository including a predicate in C#?

    c# - NerdDinner MVC4 版本 - 为什么他们删除了存储库类?