2011-08-04 66 views
1

我有一個新的MVC 3應用程序,它顯示了在數據庫中手動修改數據時出現的一些問題。MVC3工具使用實體框架與Ninject緩存問題

該工具仍在開發中,偶爾我想更改用戶的teamId。當我這樣做時,我必須殺死Web開發服務器並再次運行它,否則查詢不會選擇新的teamId。 同樣的事情,當我發佈到IIS的工具,如果我曾經修改數據庫上的東西,我需要再次複製'bin'文件夾或停止應用程序並重新運行它。

當我從應用程序本身修改數據時,我沒有任何問題。

這是我的Ninject看起來像:

public class NinjectControllerFactory : DefaultControllerFactory 
{ 
    private IKernel kernel = new StandardKernel(new TrackerServices()); 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
      return null; 
     return (IController)kernel.Get(controllerType); 
    } 

    private class TrackerServices : NinjectModule 
    { 
     public override void Load() 
     { 
      var context = new TrackerEntities(); 

      Bind<IUserRepository>().To<UserRepository>().WithConstructorArgument("context", context); 
     } 
    } 
} 

我的接口:

public interface IUserRepository : IRepository<User> 
{ 
    User GetByName(string name); 
} 

我的執行情況:

public User GetByName(string login) 
{ 
    var userLogin = _misc.GetUsername(login); 
    return _context.Users.Where(x => x.Login == userLogin).Single(); 
} 

我的索引操作

public ActionResult Index() 
{ 
    var teamid = (int)_users.GetByName("myName").TeamId; 

這從來沒有發生過,但這個工具是我與Ninject一起使用的第一個工具。我想知道我的問題和使用存儲庫之間是否存在關係?

回答

3

但是也有一些相結合,創造該問題的兩個問題:

  1. 您已經創建上下文使其有效地一個單身的方式。
  2. 實體框架不會自動檢查上下文已經跟蹤的實體的新版本。

爲了解決這個問題,我建議你每個請求重新創建存儲庫一次(不會有此一顯著的性能損失,因爲它是相當輕量級),通過使用這種結合:

Bind<IUserRepository>().To<UserRepository>().InRequestScope();

Ninject應該能夠自動創建TrackerEntities範圍內,但如果沒有(或者,如果你想清楚),可以使用以下綁定:

Bind<TrackerEntities>().ToSelf().InRequestScope();(該InRequestScope是這裏沒有真正需要,因爲默認的瞬態範圍應該沒問題)。

您也可以沿着強制刷新實體的方向走(使用ObjectContext.Refresh()),但這可能不是一個好主意,因爲您必須爲每個實體明確地執行此操作。

+0

謝謝,我會嘗試儘快並更新線程! :) – LanFeusT