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

c#-3.0 entity-framework

我在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;

用户更改某些数据并单击“保存”后,此列表将返回save方法。

HRMSDBContext context = new HRMSDBContext();

foreach (InHouseTrainingHead head in lists)
{
    context.Attach(head);
    context.ApplyPropertyChanges(head.EntityKey.EntitySetName, head);
}

context.SaveChanges();

不幸的是在SaveChanges()之后没有任何事情发生。我怎么解决这个问题?

一般承认的答案

您没有按照预期的方式使用ObjectContext.ApplyPropertyChanges 。您需要实体的两个实例 - 附加到上下文的未修改实例和分离的修改实例。然后将更改应用于未修改的附加实体,它将被修改,您可以保存更改。因此,在调用ObjectContext.ApplyPropertyChanges之前,不得附加修改后的实体,而是从数据库加载实体。


热门答案

扩展DanielBrückner的答案 - 你的样本中发生的事情是你正在尝试在head对象和它自身之间应用ApplyPropertyChanges 。显然,没有变化,因此没有任何东西得救。但是,如果您不想从数据库中获取记录,则可以手动将新连接的实体的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();


许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因