EF4 Object State Manager утверждает, что несколько записей прикреплены, когда их нет - PullRequest
3 голосов
/ 29 октября 2010

Я пытаюсь добавить функциональность в мое приложение ASP.NET MVC, чтобы изменить некоторые поля моей структуры данных.После нажатия кнопки отправки в форме вызывается следующее действие:

    [HttpPost]
    public ActionResult Edit(Document doc)
    {
        // Attempt to save the project
        if (_documentService.SaveDocument(doc) == ServiceActionResult.Success)
            return RedirectToAction("List");
        else
            return View();
    }

Метод SaveDocument() выглядит следующим образом:

    public ServiceActionResult SaveDocument(Document doc)
    {
        if (doc == null)
            return ServiceActionResult.ActionFailure;

        // Check if this is a new Document (null ID)
        if (doc.Id == 0)
            _documentRepository.Add(doc);
        else
            _documentRepository.Attach(doc);

        _documentRepository.SaveChanges();

        return ServiceActionResult.Success;
    }

Поскольку документ существует (и поэтому имеетзначение Id), я вызываю метод Attach() моего общего репозитория.Метод присоединения выглядит так:

    public void Attach(T entity)
    {
       _objectSet.Attach(entity);
    }

Когда вызывается метод Attach() набора объектов, возникает следующее исключение:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

Я не понимаю, почему это происходит, поскольку, как вы можете видеть, весь жизненный цикл запроса имеет только один вызов EF, и это последний Attach(entity) вызов.Я что-то упустил?

Как к вашему сведению, эта система работала, но, похоже, сломал ее, это было мое преобразование сначала из модели в код сначала с POCO (последний CTP).Все остальные мои функции работают так же, как и раньше, за исключением этого сценария.

Если это помогает, мой общий репозиторий получает ObjectSet из DbContext через функцию, которую я написал в своем классе контекста:

    public ObjectSet<T> CreateObjectSet<T>() where T : class
    {
        return ObjectContext.CreateObjectSet<T>();
    }


Редактировать: После просмотра моего кода из-за комментариев я только что вспомнил, что реализовал синглтон для управления контекстом.Я сделал это из-за того, что возможно, что Контроллер может получить сущности из одного класса обслуживания и использовать другой класс обслуживания для его обновления (я думаю, что это был сценарий, который я пытался решить, я реализовал это некоторое время назад, и я 'Я должен присмотреться, когда я выйду с работы).

Я использовал для этого синглтон, потому что у меня сложилось впечатление, что синглтон не будет проходить через несколько HTTP-запросов, и я предполагаю, что это может быть проблемой.Я посмотрю на это, когда вернусь домой.

1 Ответ

3 голосов
/ 29 октября 2010

RE: , поскольку вы можете видеть, что весь жизненный цикл запроса имеет только один вызов EF

Насколько мы можем см. из показанного кода время жизни ObjectContext может быть временем жизни приложения.Если это так, то, возможно, в этом и заключается проблема.

Можете ли вы объяснить, как вы управляете временем жизни ObjectContext ... это за запрос Http?

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