2013-04-22 47 views
1

我在我的項目上建立了DI注入,注入IUnitOfWork的實現,該實現有我的存儲庫和Commit()方法。我把這個注入到我的業務層中,一切都很好。DI,實體框架和延期執行

public Business(IUnitOfWork context) { 
    this.Context = context; 
} 

public IEnumerable<User> ExpiredUsers() { 
    return this.Context.Users.Query().Where(u => u.Expired == true); 
} 

這商務艙注入到我的控制器

public class UsersController : Controller { 
    public UsersController(Business business) { 
     this.Business = business; 
    } 

    public ActionResult Home() { 
     return View(new HomeViewModel(business.ExpiredUsers()); 
    } 
} 

用戶是一個IQueryable,和我的商業方法使用實體框架很好地轉化爲SQL。我的問題是,在執行此方法後,查詢用戶對象上的屬性,從而導致延遲執行。在我的情況下,說視圖中的東西進入每個用戶的地址.State.Cities,或其他一些導致推遲執行和查詢數據庫的屬性n次。

我已經設置DI,使用Ninject爲每個請求創建數據庫上下文(IUnitOfWork)。由於數據庫上下文仍處於打開狀態,因此我不知道如何防止發生這種情況。我寧願視圖拋出異常;以便我可以儘早地發現這些問題。爲了完整起見,這裏是我的模塊。

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<IUnitOfWork>().To<SqlUnitOfWork>().InRequestScope(); 
    } 
} 
+0

是在address.State.Cities查看內部或視圖模型裏面發生了什麼?如果它位於視圖內部,那麼視圖未編譯的事實將迫使你的上下文發出額外的查詢。 – andresuribe 2013-04-22 03:59:50

回答

-1

強制ExpiredUsers通過調用ToList()來枚舉列表:

return this.Context.Users.Query().Where(u => u.Expired == true).ToList(); 
+0

會很有趣,看到downvote的原因 - 不知道還有多少人可以防止多次枚舉'ExpiredUsers'結果的代碼不會導致多個查詢執行... – 2013-04-22 04:08:05

+0

這會將數據帶入調用ToList()的內存,但它並不妨礙該觀點導致推遲執行,至少在我的情況下。我想知道InRequestScope是否太大,如果我可以限制它到商務類。 – Michael 2013-04-22 04:08:07

+0

我又看了一遍 - 看起來你正在收集一系列查詢,這就是爲什麼每次更新時都要執行的原因。嘗試更改函數以實際執行查詢而不是返回查詢。 – Gjeltema 2013-04-22 04:32:18