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