0

希望有人可以帮助我。

我的 ASP.NET MVC 项目中有一个控制器,用于编辑所谓的调查表。调查表与 Form 类型的对象是一对一的关系。保存调查表格时,我还想设置表格的名称。但是表单属性为空。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

4 回答 4

1

尝试:

db.Entry(surveyform).Reference(x => x.Form).Load();
surveyform.Form = db.Entry(surveyform).Reference(x => x.Form).CurrentValue;
于 2013-09-01T13:40:37.253 回答
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()然后复制数据库版本中的导航属性。

话虽如此,如果可以提供帮助,最好不要在视图中使用数据库模型;关注点分离等等。如果该模型上有多个属性需要数据库而不是视图(反之亦然),那么您可能希望为其使用本地视图模型并将属性复制到新检索的数据库实体.

于 2013-09-01T14:28:27.017 回答
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。

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

于 2013-09-01T13:54:40.553 回答
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 });
        }

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

谢谢大家!

于 2013-09-01T17:19:44.413 回答