实体框架Async Call to Repository将虚拟实体返回为null

时间:2015-02-23 21:39:53

标签: c# linq entity-framework asynchronous

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

 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()??

1 个答案:

答案 0 :(得分:1)

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

我还在EF周围实现了一个Repository模式,但是创建了一个通用的存储库,其中的方法是通用的而不是类型。类型本身具有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();

总之,使用这种模式有很多可能性,只需要弄清楚你需要什么以及放在哪里。