实体框架核心存储库模式渴望负载

时间:2020-05-10 04:43:38

标签: c# sql-server generics entity-framework-core

我正在尝试使用存储库模式构建Web应用程序。这样做时,我注意到导航属性没有加载。我可以使用EF代理加载属性,但是当我使用DTO时,确实不喜欢这样。从那以后,我删除了所有代理代码,并决定只需要提供一种方法即可急切加载我关心的数据。

在我的存储库中,我有一个与此类似的界面。通过使用DBSet,我可以使用Find方法来一般地找到该值并从存储库中返回它。这样做,我无法传递Includes来解析导航属性。

public async Task<T> GetById(int Id)
        {
            var query = await this.Context.Set<T>().FindAsync(Id);
            // Left split like this for clarity
            return query;
        }

我完成这项工作的唯一方法是删除通用部分,然后在UserRepository中添加一个名为GetUserById的新方法。

    public class UserRepository : RepositoryBase<User>, IUserRepository
    {
        private readonly Context _context;
        public UserRepository(Context context) : base(context) {
            _context = context;
        }

        public User GetUserById(int Id)
        {
            var query = _context.Users.Include("Department").Where(x => x.Id == Id).FirstOrDefault();
            return query;
        }
    }

请告诉我有更好的方法。

1 个答案:

答案 0 :(得分:0)

尝试此GetUserById实现:

    public User GetUserById(int Id, params Expression<Func<User, object>>[] includes)
    {
        var query = _context.Users.Where(x => x.Id == Id);

        foreach (var include in includes)
        {
            query.Include(include);
        }

        return query.FirstOrDefault();
    }

这就是您的称呼方式:


    var repo = new UserRepository();
    var user = repo.GetUserById(100, u => u.Department);