C# ASP.NET-MVC3与EF4.1,编辑导航属性不';保存更改后不更改数据

C# ASP.NET-MVC3与EF4.1,编辑导航属性不';保存更改后不更改数据,c#,asp.net,asp.net-mvc-3,entity-framework,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

我正在尝试使用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; }
}
我可以看到
@event
中的位置在
@event.place=\u db.Places.Find(placeID)之后从null更改为新位置但在
保存更改后
位置id与编辑前保持不变。 知道为什么吗?
谢谢

我怀疑这可能是因为您的事件对象未连接到上下文。来自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; }
来解决这个问题

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

我不知道为什么它与PlaceId属性一起工作,有人能解释一下吗


谢谢!

代码>[DataContract]
与EF无关。您应该检查生成的数据库中是否有列Event.PlaceId。生成的数据库中有Event.PlaceId,还有我创建事件对象时选择的位置的id,但由于某些原因,编辑后PlaceId值没有更改。我想您是对的,我检查了_Db.条目(@Event).State在_db.Events.Attach(@event)之前,并且状态已分离。问题是在Attach和@event.place的设置之后,状态保持不变。我手动将状态更改为modified,并调用SaveChanges,但出现以下异常“保存未公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源。可以在保存时处理异常…”知道吗?innerException说了什么?innerException是“Store update、insert或delete语句影响了意外的行数(0)。自加载实体后,实体可能已被修改或删除。刷新ObjectStateManager条目。System.Data.Mapping.Update.Internal.UpdateTranslator.ValidateRowsInfected(Int64 rowsAffected,UpdateCommand和source)的System.Data.Mapping.Update.Internal.UpdateTranslator.Update(EntityStateManager,EntityAdapter adapter)的System.Data.EntityClient.EntityAdapter.Update的堆栈跟踪位于System.Data.Entity.Internal.InternalContext.SaveChanges()的System.Data.Objects.ObjectContext.SaveChanges(SaveOptions选项)中的(IEntityStateManager entityCache)
public string PlaceId { get; set; }