«На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker» с пользовательским связывателем модели - PullRequest
2 голосов
/ 30 января 2012

Я следил за ответом Дарина на вопрос, который у меня возник при похудении моих контроллеров, и у меня возникают проблемы с этим IEntityChangeTracker исключением:

AnНа объект сущности нельзя ссылаться несколькими экземплярами IEntityChangeTracker.

Вот мой механизм связывания модели:

public class PostModelBinder : IModelBinder
{
    private readonly IPostRepository _repository;

    public PostModelBinder(IPostRepository repository)
    {
        _repository = repository;
    }

    public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
    {
        var postIDValue = controllerContext.Controller.ValueProvider.GetValue("postID");
        int postID;

        if (postIDValue == null || !int.TryParse(postIDValue.AttemptedValue, out postID))
            return null;

        return _repository.FindPost(postID, filterByPublished: true);
    }
}

После этого мой фильтр настраиваемых действий просто выполняет небольшую проверку насообщение и перенаправляет, если сообщение не является действительным.До этого момента все хорошо.Ошибка происходит в моем контроллере, когда я пытаюсь обновить количество прочитанных сообщений:

public class PostsController : Controller
{
    private IPostRepository postRepository;

    // snip...

    [AutoMap(typeof(Post), typeof(PostViewModel)), HttpGet]
    [PostActionFilter]
    public ActionResult ShowPost(Post model)
    {
        postRepository.PostVisited(model);

        return View(model);
    }
}

Я понимаю, что жалоба IEntityChangeTracker связана с тем, что я фактически получаю 2 репозитория, ссылающихся на один и тот же объект, и это простоплохой моджо, ожидающий случиться.Я знаю, что мог бы вставить вызов PostVisited() в PostModelBinder, но обновление модели не похоже на поведение, которое здесь относится.

Есть ли другой способ обойти это?

Спасибо.

1 Ответ

2 голосов
/ 31 января 2012

Исходя из ошибки, я предполагаю, что ваши два IPostRepository объекта реализации используют разные контексты объекта Entity Framework; Вы можете исправить это, используя один и тот же контекст объекта в запросе.

Некоторые контейнеры DI поддерживают время жизни объекта для каждого запроса, в противном случае вы можете лениво загрузить и сохранить свой объектный контекст в HttpContext.Items и утилизировать его в конце запроса, как указано в этот вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...