Я получаю сообщение об ошибке: «На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker.» С .net MVC2 и Entity Framework4 - PullRequest
0 голосов
/ 05 января 2011

У меня большая проблема с некоторых дней, и я очень новичок в Entity Framework.У меня есть 2 лица: группа и новости.Новости видны одной или нескольким группам.Я использую два репозитория (newsRepository и groupsRepository).

Это мой метод создания новостей:

    public ActionResult Create()
    {
        return View(new CreateNewsViewModel(new News()));
    }

    [HttpPost]
    public ActionResult Create(CreateNewsViewModel model)
    {
        model.news.CategoryId = Int32.Parse(Request.Form["news.CategoryId"]);

        if (ModelState.IsValid)
        {
            News news = new News();

            DateTime date = DateTime.Now;

            //AuthorId a recuperer
            news.AuthorId = 1;
            news.Title = IntranetTools.UppercaseFirst(model.news.Title.Trim());
            news.Content = model.news.Content;
            news.IsVisible = Request.Form["news.IsVisible"].Contains("true");
            news.CreateDate = date;
            news.PublicationDate = date;
            news.LastChangedDate = date;
            news.CategoryId = model.news.CategoryId;

            // Collection des groupes concernés
            foreach (var c in model.allGroups)
            {
                if (Request.Form["" + c.GroupId].Contains("true"))
                {
                    News.Groups.Add(c);
                }
            }

            _newsRepository.AddToNewsSet(news);
            _newsRepository.SaveChanges();

            return Redirect("/NewsAdmin/Index/");
        }
        return View(model);
    }

Я говорю, что все мои группы уже созданы.Я просто хочу вставить группы (выбранные пользователем с помощью флажков).В моем «CreateNewsViewModel» я создаю список групп, который содержит все существующие группы в моей БД.Я получаю список в моем представлении через цикл «foreach» и создаю флажок для каждой группы.

Я повторно использую тот же список в моем контроллере для сравнения, если флажки были отмечены.Для каждого «истинного» значения я добавляю группы в коллекцию групп моих новостей (только что созданных).

При этом я получаю следующее сообщение об ошибке:

«Объект сущностина несколько экземпляров IEntityChangeTracker нельзя ссылаться ». (в строке _newsRepository.AddToNewsSet (news);)

Я пробую некоторые решения, но все еще не понимаю, как решить эту проблему.

Спасибо за все


Редактировать

На самом деле, если я использую явно два контекста и отсоединяю / присоединяю свои объекты к другому контексту, это нормально, и яУ меня нет ошибок.

            ObjectContext context  = _newsRepository.Context;
            ObjectContext context2 = _groupsRepository.Context;

            foreach (var c in groups)
            {
                if (Request.Form["" + c.GroupId].Contains("true"))
                {
                    context2.Detach(c);
                    context.Attach(c);
                    news.Groups.Add(c);
                }
            }

Я хотел бы использовать решение Ладислава Мрнки и использовать внедрение зависимостей (я использую инфраструктуру Ninject), чтобы передать один и тот же ObjectContext моим репозиториям (при обработке одного запроса).Я понимаю концепцию, но не знаю, как ее кодировать.

1 Ответ

1 голос
/ 05 января 2011

В сообщении об ошибке говорится, что объект News или любой из связанных объектов Group присоединен к другому экземпляру ObjectContext.Как реализован ваш репозиторий и как вы получили model.allGroups?Если вы загрузили allGroups из GroupsRepository, который имеет собственный экземпляр ObjectContext, то это, вероятно, является источником проблемы.Решение будет следующим:

  • (предпочтительнее) Совместное использование одного ObjectContext для всех репозиториев при обработке одного запроса
  • Отсоединение объектов при загрузке их из базы данных (ObjectContext имеет метод Detach)
  • Закрыть ObjectContext при загрузке объектов из базы данных
...