2015-02-23 96 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(); 

總之有很多的可能性,使用這種模式,它只是搞清楚你需要什麼,在哪裏的問題把它。