我在Visual Studio 2008中使用实体框架,确定它既是.NET Framework又是VS本身。我的应用程序是在n层环境中开发的。第一步,我将数据从上下文转换为集合并序列化为用户。
HRMSDBContext context = new HRMSDBContext();
List<InHouseTrainingHead> heads = context.InHouseTrainingHead.ToList<InHouseTrainingHead>();
foreach (InHouseTrainingHead head in heads)
{
context.Detach(head);
}
return heads;
用户更改某些数据并单击“保存”后,此列表将返回保存方法。
HRMSDBContext context = new HRMSDBContext();
foreach (InHouseTrainingHead head in lists)
{
context.Attach(head);
context.ApplyPropertyChanges(head.EntityKey.EntitySetName, head);
}
context.SaveChanges();
不幸的是在SaveChanges()之后没有任何事情发生。我该如何解决这个问题?
答案 0 :(得分:4)
扩展DanielBrückner的答案 - 您的示例中发生的事情是您在ApplyPropertyChanges
对象与其自身之间尝试head
。显然,没有变化,因此没有任何东西得救。但是,如果您不想从数据库中获取记录,则可以手动将新连接的实体的EntityState
设置为Modified
。在这种情况下,它将保存在DB中:
HRMSDBContext context = new HRMSDBContext();
foreach (InHouseTrainingHead head in lists)
{
context.Attach(head);
ObjectStateEntry addedEntity = context.ObjectStateManager.GetEntry(head);
addedEntity.ChangeState(EntityState.Modified);
}
context.SaveChanges();
答案 1 :(得分:2)
您没有按照预期的方式使用ObjectContext.ApplyPropertyChanges
。您需要实体的两个实例 - 附加到上下文的未修改实例和分离的修改实例。然后将更改应用于未修改的附加实体,它将被修改,您可以保存更改。因此,您不得附加修改后的实体,而是在调用ObjectContext.ApplyPropertyChanges
之前从数据库加载实体。