Инструмент MVC3, использующий проблемы кэширования Entity Framework с Ninject - PullRequest
1 голос
/ 05 августа 2011

У меня есть новое приложение MVC 3, которое показывает некоторые проблемы при изменении данных вручную в базе данных.

Инструмент все еще находится в разработке, и время от времени я хочу изменить идентификатор команды моего пользователя. Когда я это сделаю, мне придется убить Сервер веб-разработки и запустить его снова, иначе запросы не выберут новый 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 Ответ

3 голосов
/ 05 августа 2011

Есть две проблемы, которые объединяются, чтобы создать эту проблему:

  1. То, как вы создали свой контекст, делает его фактически единым.
  2. Entity Framework будетне проверять автоматически новую версию сущности, контекст которой уже отслеживается.

Чтобы решить эту проблему, я бы порекомендовал вам заново создавать хранилище один раз для каждого запроса (не будет существенной производительностинажмите для этого, так как он довольно легкий), используя эту привязку:

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

Ninject должен иметь возможность автоматически создавать ваш контекст TrackerEntities, но если нет (или если выЯ хочу прояснить это), вы можете использовать следующую привязку:

Bind<TrackerEntities>().ToSelf().InRequestScope(); (InRequestScope здесь на самом деле не требуется, так как переходная область по умолчанию должна быть в порядке).

Вы также можете пойти по пути принудительного обновления сущности (используя ObjectContext.Refresh()), но это, вероятно, не очень хорошая идея, потому что вам придется делать это явно для каждой сущности.

...