2015-02-23 93 views
0

我已实施通用存储库。问题是我在主返回类型中的虚拟类型是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的()?

+0

我解决了这个问题,进入存储库并添加一个自定义的方法,我可以很容易地使用include ahmadalibaloch 2015-03-26 17:49:34

回答

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

总之有很多的可能性,使用这种模式,它只是搞清楚你需要什么,在哪里的问题把它。