【问题标题】:Entity Framework Async Call to Repository returns virtual entities as nullEntity Framework Async Call to Repository 将虚拟实体返回为 null
【发布时间】:2015-02-23 21:39:52
【问题描述】:

我已经实现了通用存储库。问题是我的主要返回类型中的虚拟类型为空。如何将它们包含在异步调用中? 这是我的类型:

 public class Translation : Entity
    {
        public string Text { get; private set; }
        public Guid TranslationKeyID { get; set; }
        [ForeignKey("TranslationKeyID")]
        public virtual TranslationKey TranslationKey { get; set; }
    }

现在这是我希望 TranslationKey 实体也出现在我的结果中的方法,但我只得到 TranslationKeyId。 我的服务方法:

 public async Task<List<TranslationDto>> ListTanslationsAsync()
    {
        var translations = await _translationRepository.GetAllAsync().
        if (translations != null)
        {
            return translations.ProjectedAs<List<TranslationDto>>();
        }

        return null;
    }

用什么来代替 GetAllAsync()??

【问题讨论】:

  • 我通过进入存储库并添加一个自定义方法解决了这个问题,我可以在其中轻松使用 include

标签: c# linq entity-framework asynchronous


【解决方案1】:

什么是 TranslationDto,您是如何围绕 EF 实现存储库模式的?简而言之,您可能有延迟加载或您没有调用 Include,但这里有更多关于如何使您的实现更好的信息。

我还围绕 EF 实现了存储库模式,但创建了一个通用存储库,其中方法是通用的,而不是类型。类型本身有一个 DbContext 的实例,并且方法对 Set 进行相应的调用,因此 DbContext 中没有硬编码的 DbSet 实例。这是您可以使用的示例,然后您可以使用 Autofac 或其他一些 IoC 框架将其连接在一起。

public interface IMyGenericRepository
{
   TEntity Find<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class;
   IQueryable<TEntity> Filter<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class;
}
public sealed class MyGenericRepository : IMyGenericRepository
{
    private DbContext _dbContext;
    public virtual TEntity Find<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
    {
        return _dbContext.Set<TEntity>().FirstOrDefault(predicate);
    }
    public virtual IQueryable<TEntity> Filter<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
    {
        return DbSet<TEntity>().Where(predicate).AsQueryable<TEntity>();
    }

}

您可以通过在通用存储库中实现您的访问逻辑来对其进行调整,使其返回 List 的一个实例并省略 Dto。您也可以在必要时或默认情况下实现 async/await 关键字。

现在是第 2 部分,在对象图中获取对象。 这可以通过使用 Include 扩展来确保 EF 在检索对象时填充图形的一部分来实现。这可以由调用者完成,或者您可以从通用存储库实现子类(继承)以调用 Include。上面的代码可以这样调用:

var result = await _genericRepository.Filter<Translation>(add lambda here).Include(x => TranslationKey).ToListAsync();

简而言之,使用这种模式有很多可能性,只需弄清楚您需要什么以及将其放置在哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 2011-12-06
    • 2014-10-07
    • 1970-01-01
    • 2019-06-17
    • 2020-01-13
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多