希望有人可以帮助我。
我的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();
}
}
我的问题是:如何将“调查表”附加到模型中,以便加载相关数据?
提前致谢!
答案 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 });
}
这是一次试验和错误。一种编程方式我不赞成和不喜欢,但我很高兴它终于有效了。
全部谢谢!