【问题标题】:entity framework core, generic repository method with inclusion navigation properties实体框架核心,具有包含导航属性的通用存储库方法
【发布时间】:2017-11-04 12:49:08
【问题描述】:

我想通过业务逻辑项目创建一个通用数据访问层,业务逻辑层必须与我拥有存储库的 DAL 层交互。 我想要一个短暂的数据上下文和所有返回 IEnumerable 而不是 IQueryable 的存储库方法。 提示 GetAll 方法示例如何通过 ThenInclude 或 Select 将连接的数据提取到依赖表。

public class GenericDataRepository<T> : IGenericDataRepository<T> where T : class
{
    public virtual IList<T> GetAll(params Expression<Func<T, object>>[] navigationProperties)
    {

        List<T> list;
        using (var context = new Context())
        {
            IQueryable<T> dbQuery = context.Set<T>();

            //Apply eager loading
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Include<T, object>(navigationProperty);

            list = dbQuery
                .AsNoTracking()
                .ToList<T>();
        }
        return list;
    }

}

然后包含(prop2=>prop2.i)?

dbQuery.Include(navigationProperty).ThenInclude(prop2=>prop2.i)

【问题讨论】:

    标签: c# entity-framework c#-4.0 asp.net-core


    【解决方案1】:

    这实际上是一个糟糕的设计。你不想这样做。如果你想抽象你的数据访问层,那么就完全这样做。创建一个为您的应用程序提供 API 的库,它准确地返回您需要的内容,不多也不少。如果您仍然允许任意查询,那么只需直接使用您的上下文,因为您实际上并没有为自己购买任何东西,除了要维护的额外层,没有真正的好处。

    【讨论】:

    • 谢谢。我想创建一个用于访问数据的 api,它使用了一层业务逻辑。将来,可以用 dapper 替换 EF,只留下 EF 用于迁移。我了解您建议在业务逻辑层中使用 IGureble?从数据访问层抽象出来,我想要一层业务逻辑。业务逻辑-> 存储库-> EF-> Db
    • 问题是,像这样切换适配器可能会对查询的构建方式产生相应的影响。如果这确实是您的目标,那么您希望您的应用程序依赖于 layer.GetSomeSpecificThing() 之类的方法,而不是 layer.Get(someQuery, includeSomeStuff, moreLogic)。这将无限地更具可维护性和适应性。
    • 是的,你是对的,业务逻辑将包括许多特定的方法,并将工作与存储库结合到一个特定的方法中。您如何建议通过 EF 创建对数据的访问?
    • 不确定你的意思。您的数据层应该直接与 EF 或其他什么进行交互。它是数据层,因此如果它直接与底层适配器一起使用,它是完全可以接受的,甚至是最好的。如果该适配器发生更改,则无论如何都需要更改此代码。然后,您的应用程序仅依赖于数据层。
    • 我理解这一点,这意味着使用向外部提供 IQuereble 的经典通用存储库。客户端直接(例如通过 DI)使用存储库包装器。我想做一层业务逻辑,因为经常要做同样的请求和拉取依赖数据,我想把这些动作放到业务逻辑中,由IEnumerable提供。并且所有使用 context 和 IQueryable 的工作都对客户端隐藏。
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多