Вложенная модель привязки MVC3 с использованием Entity Framework с ключами GUID - PullRequest
1 голос
/ 03 ноября 2011

Я боролся с этим весь день и до сих пор не могу.

Я могу упростить задачу следующим образом: У меня есть отчеты и отчеты есть формы. У меня есть модели сущностей каждого. У них есть идентификатор Guid, как показано ниже.

Model

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

    // GET: /AllInOne/Create

    public ActionResult Create()
    {
        ViewBag.PossibleReportBases = reportBaseRepository.All;
        ViewBag.PossibleCategories = categoryRepository.All;

        var model = new Report {FromDate = DateTime.Now};
        model.Forms.Add(new Form());
        return View(model);
    }

    // POST: /AllInOne/Create

    [HttpPost]
    public ActionResult Create(Report report)
    {
        if (ModelState.IsValid) {
            reportRepository.InsertOrUpdate(report);
            reportRepository.Save();
            return RedirectToAction("Index");
        }
        else
        {
            ViewBag.PossibleReportBases = reportBaseRepository.All;
            ViewBag.PossibleCategories = categoryRepository.All;
            return View();
        }
    }

Код репозитория выглядит следующим образом:

    public void InsertOrUpdate(Report report)
    {
        if (report.Id == default(System.Guid)) {
            // New entity
            report.Id = Guid.NewGuid();
            context.Reports.AddObject(report);
        } else {
            // Existing entity
            context.Reports.Attach(report);
            context.ObjectStateManager.ChangeObjectState(report, EntityState.Modified);
        }
    }

В какой-то момент привязка выдала мне эту ошибку: Коллекция EntityCollection уже инициализирована. Метод InitializeRelatedCollection следует вызывать только для инициализации новой коллекции EntityCollection во время десериализации графа объекта.

Я перепробовал много вещей для представлений, но ни один из них не сработал.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 03 ноября 2011

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

   public void InsertOrUpdate(Report report)
    {
        // i prefer Guid.Empty but no big deal
        if (report.Id == default(System.Guid)) {
            // New entity
            report.Id = Guid.NewGuid();
            context.Reports.AddObject(report);
        } 
        context.SaveChanges();
    }
...