MVC控制器使用相关数据

时间:2013-09-01 13:35:20

标签: asp.net-mvc entity-framework

希望有人可以帮助我。

我的ASP.NET MVC项目中有一个控制器,用于编辑所谓的调查表单。调查表与Form类型的对象具有1对1的关系。保存调查表单时,我还想设置表单的名称。但是form属性为null。 FormID属性具有正确的值(首先使用数据库,EF5)。这是问题所在。

    [HttpPost]
    public ActionResult Edit(SurveyForm surveyform)
    {
      if (ModelState.IsValid)
        {
            db.Entry(surveyform).State = EntityState.Modified;

            // This cannot be done because surveyform.Form is null
            surveyform.Form.Name = "Wish this would work!";


            db.SaveChanges();
        }
    }

我的问题是:如何将“调查表”附加到模型中,以便加载相关数据?

提前致谢!

4 个答案:

答案 0 :(得分:1)

尝试:

db.Entry(surveyform).Reference(x => x.Form).Load();
surveyform.Form = db.Entry(surveyform).Reference(x => x.Form).CurrentValue;

答案 1 :(得分:1)

猜测,我会说正在回送的实体没有被跟踪,因此实体框架没有意识到它来自数据库。行db.Entry(surveyForm)获取与POSTed表单匹配的条目,但您不会保留它。试试这个:

[HttpPost]
public ActionResult Edit(SurveyForm surveyform)
{
  if (ModelState.IsValid)
    {
        var formEntry = db.Entry(surveyform);

        formEntry.State = EntityState.Modified;
        formEntry.Form.Name = "This might work...";

        db.SaveChanges();
    }
}

希望.Entry()能够获得数据库的版本。不幸的是,您可能必须复制属性值,尽管您可能会发现可以使用.Attach()然后从数据库版本复制导航属性。

话虽如此,如果你可以帮助它,通常不要在视图中使用你的数据库模型;分离关注点和所有这些。如果该模型上有多个属性需要数据库而不是视图(反之亦然),那么您可能希望为其使用本地视图模型,并将属性复制到新获取的数据库实体

答案 2 :(得分:0)

在你的模型中,确保你有这样的导航符号:

public virtual Form Form { get; set; }

然后在你的DbContext中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Entity<SurveyForm>().HasOptional(p => p.Form);
 }

HasOption可以替换为HasRequired。

我从未遇到过你所遇到的确切问题,所以我希望这会有所帮助。

答案 3 :(得分:0)

最后,我结合了上述多项建议,最终得到以下结论。

我在观点中添加了以下内容:

    @Html.TextBox("formName", Model.Form.Name)

然后将控制器中的代码更改为:

    [HttpPost]
    public ActionResult Edit(string formName, SurveyForm surveyForm)
    {
        if (ModelState.IsValid)
        {
            var surveyFormEntry = db.Entry<SurveyForm>(surveyForm);
            db.SurveyForms.Attach(surveyForm);
            surveyFormEntry.State = EntityState.Modified;

            surveyFormEntry.Reference(x => x.Form).Load();
            surveyForm.Form = db.Entry(surveyForm).Reference(x => x.Form).CurrentValue;
            surveyForm.Form.Name = formName;

            db.SaveChanges();
            return RedirectToAction("Index", new { surveyId = surveyForm.SurveyID });
        }

这是一次试验和错误。一种编程方式我不赞成和不喜欢,但我很高兴它终于有效了。

全部谢谢!