ASP.NET-MVC3 与 EF4.1,编辑导航属性不会在保存更改后更改数据



我正在尝试用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属性一起工作,有人能解释一下吗?

谢谢!

最新更新