ASP.NET-MVC3与EF4.1,编辑导航属性不';保存更改后不会更改数据
本文关键字:保存更改 数据 ASP EF4 编辑 属性 导航 NET-MVC3 | 更新日期: 2024-06-14 08:00:23
我正在尝试用EF4.1 编辑ASP.NET-MVC3中具有导航属性的实体
我的型号:
[DataContract]
public class Event
{
[Key]
public int ID { get; set; }
public string Name { get; set; }
public Place Place { get; set; }
}
[DataContract]
public class Place
{
[Key]
public string ID { get; set; }
public string Name { get; set; }
}
我的数据上下文类:
public class myDB: DbContext
{
public DbSet<Event> Events { get; set; }
public DbSet<Place> Places { get; set; }
}
我的控制器后期编辑方法:
[HttpPost]
public ActionResult Edit(Event @event, string placeID)
{
if (ModelState.IsValid)
{
@event.Place = _db.Places.Find(placeID);
_eventoDB.Entry(@event).State = EntityState.Modified;
_eventoDB.SaveChanges();
return RedirectToAction("Index");
}
return View(@event);
}
我可以看到@event
中的位置从null更改为@event.Place = _db.Places.Find(placeID);
之后的新位置,但在SaveChanges
之后,位置id与编辑前保持不变。知道为什么吗?感谢
我怀疑这可能是因为您的Event对象没有附加到上下文。来自MVC请求的EF对象在手动附加它们之前不属于上下文。这可能会解决问题:
[HttpPost]
public ActionResult Edit(Event @event, string placeID)
{
if (ModelState.IsValid)
{
_eventoDB.Events.Attach(@event);
@event.Place = _db.Places.Find(placeID);
// should not need to mark as modified, previous line will do it
// _eventoDB.Entry(@event).State = EntityState.Modified;
_eventoDB.SaveChanges();
return RedirectToAction("Index");
}
return View(@event);
}
尝试SonicDynamite解决方案后,出现以下异常"保存不公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更容易地处理保存时的异常。有关详细信息,请参阅InnerException 。"
经过一些谷歌研究,我发现添加属性
public string PlaceId { get; set; }
到我的Event实体解决问题。
此外,不需要像SonicDynamite建议的那样附加事件对象
我不知道为什么它与PlaceId属性一起工作,有人能解释一下吗?
谢谢!