使用带有GUID键的Entity Framework的MVC3绑定嵌套模型

时间:2011-11-03 16:23:10

标签: asp.net-mvc-3 entity-framework nested-forms model-binding

我一整天都在和这个斗争,但我还是失败了。

我可以简化问题如下: 我有报告和报告有表格。我有每个的实体模型。他们有Guid id's,如下所示。

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 :(得分:0)

我不认为你需要打扰附加。如果您从上下文中选择了报告,则表明它已被跟踪。您可以像这样简化您的存储库

   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();
    }