实体框架SaveChanges()不起作用?

时间:2010-07-13 10:34:35

标签: entity-framework c#-3.0

我在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()之后没有任何事情发生。我该如何解决这个问题?

2 个答案:

答案 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之前从数据库加载实体。