0

我正在尝试使用 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 与编辑之前保持相同之后。知道为什么吗?谢谢

4

2 回答 2

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);
}
于 2012-07-22T21:25:19.880 回答
0

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

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

public string PlaceId { get; set; }

到我的事件实体解决问题。

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

我不知道为什么它与 PlaceId 属性一起使用,有人可以解释一下吗?

谢谢!

于 2012-07-23T10:58:42.183 回答