带有EF4.1的ASP.NET-MVC3,编辑导航属性不会在SaveChanges之后改变数据

时间:2012-07-22 15:31:01

标签: c# asp.net asp.net-mvc-3 entity-framework

我正在尝试使用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地点从@event.Place = _db.Places.Find(placeID);后的空位变为新位置,但在SaveChanges之后,地点ID与编辑前保持一致。 任何想法为什么? 感谢

2 个答案:

答案 0 :(得分:1)

我怀疑这可能会发生,因为您的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);
}

答案 1 :(得分:0)

在我尝试SonicDynamite解决方案后,我得到以下异常“保存未公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源通过在实体类型中公开外键属性,可以更容易地在保存时处理异常。有关详细信息,请参阅InnerException。“

经过一些谷歌研究后,我发现添加了一个属性

public string PlaceId { get; set; }

到我的Event实体解决问题。

此外,无需像SonicDynamite建议的那样附加事件对象

我不知道为什么它适用于PlaceId属性,任何人都可以解释一下吗?

谢谢!