代码之家  ›  专栏  ›  技术社区  ›  David

实体框架SaveChanges()不工作?

  •  2
  • David  · 技术社区  · 15 年前

    我在visualstudio2008中使用实体框架,当然它是SP1.netframework和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 回复  |  直到 7 年前
        1
  •  2
  •   Daniel Brückner    15 年前

    ObjectContext.ApplyPropertyChanges 它的使用方式。您需要实体的两个实例—一个附加到上下文的未修改实例和一个分离的已修改实例。然后,更改将应用于未修改的附加实体,该实体将被修改,您可以保存更改。因此,在调用之前,不能附加修改过的实体,而是从数据库中加载实体 ObjectContext.ApplyPropertyChanges .

        2
  •  4
  •   Yakimych    15 年前

    为了扩展Daniel Brckner的答案-在您的示例中发生的是您正在尝试 ApplyPropertyChanges head 对象和自身。显然,没有任何更改,因此没有保存任何内容。但是,如果不想从数据库中获取记录,可以设置 EntityState 新附加到的实体的 Modified 手动。在这种情况下,它将保存在数据库中:

    HRMSDBContext context = new HRMSDBContext();
    
    foreach (InHouseTrainingHead head in lists)
    {
        context.Attach(head);
        ObjectStateEntry addedEntity = context.ObjectStateManager.GetEntry(head);
        addedEntity.ChangeState(EntityState.Modified);
    }
    
    context.SaveChanges();