gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:24:21 25 4
gpt4 key购买 nike

让我说,我得出的结论(经过大量试验)使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com