使用Ninject的Entity Framework缓存问题的MVC3工具

时间:2011-08-04 23:44:44

标签: asp.net-mvc entity-framework ninject

我有一个新的MVC 3应用程序,它在数据库中手动修改数据时会出现一些问题。

该工具仍处于开发阶段,偶尔我想更改用户的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一起使用的第一个工具。我想知道我的问题与使用存储库之间是否存在关联?

1 个答案:

答案 0 :(得分:3)

有两个问题正在组合以解决此问题:

  1. 您创建上下文的方式使其有效地成为单身人士。
  2. 实体框架不会自动检查上下文已跟踪的实体的新版本。
  3. 要解决这个问题,我建议您通过使用此绑定为每个请求重新创建一次存储库(因为它相当轻量级,不会有显着的性能损失):

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

    Ninject应该能够自动创建TrackerEntities上下文,但如果没有(或者如果你想说清楚),你可以使用以下绑定:

    Bind<TrackerEntities>().ToSelf().InRequestScope();(此处并不真正需要InRequestScope,因为默认的瞬态范围应该没问题。)

    你也可以继续强制刷新实体(使用ObjectContext.Refresh()),但这可能不是一个好主意,因为你必须为每个实体明确地做。