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

实体框架上是否有更新对象持有者?

  •  1
  • balexandre  · 技术社区  · 14 年前

    插入/更新 像这样的领域(如果有更好的方法,请这么说-我们一直在学习)

    public void UpdateChallengeAnswers(List<ChallengeAnswerInfo> model, Decimal field_id, Decimal loggedUserId)
    {
        JK_ChallengeAnswers o;
        foreach (ChallengeAnswerInfo a in model)
        {
            o = this.FindChallengeAnswerById(a.ChallengeAnswerId);
            if (o == null) o = new JK_ChallengeAnswers();
    
            o.answer = FilterString(a.Answer);
            o.correct = a.Correct;
            o.link_text = "";
            o.link_url = "";
            o.position = FilterInt(a.Position);
    
            o.updated_user = loggedUserId;
            o.updated_date = DateTime.UtcNow;
    
            if (o.challenge_id == 0)
            {
                // New record
                o.challenge_id = field_id;  // FK
                o.created_user = loggedUserId;
                o.created_date = DateTime.UtcNow;
    
                db.JK_ChallengeAnswers.AddObject(o);
            }
            else
            {
                // Update record
                this.Save();
            }
        }
    
        this.Save(); // Commit changes
    }
    

    如你所见 this.Save() (女巫召唤 db.SaveChanges(); )

    添加 占位符 AddObject 方法,换句话说,新对象不是立即提交的,我们可以放置任意多的对象。

    但是当它是一个更新时,我需要先保存,然后再转到下一个对象,有没有一个方法可以使用,比如说:

            if (o.challenge_id == 0)
            {
                // New record
                o.challenge_id = field_id;
                o.created_user = loggedUserId;
                o.created_date = DateTime.UtcNow;
    
                db.JK_ChallengeAnswers.AddObject(o);
            }
            else
            {
                // Update record
                db.JK_ChallengeAnswers.RetainObject(o);
            }
        }
    
        this.Save(); // Only save once when all objects are ready to commit
    }
    

    需要保存到数据库中5次

    谢谢您。

    2 回复  |  直到 14 年前
        1
  •  2
  •   RPM1984    14 年前

    如果你有一个附着在图形上的对象,如果你 修改 此对象的值,则实体标记为 被改进的 .

    .AddObject ,则实体标记为 .

    什么也没发生-只是图的分段。

    那么 SaveChanges() ,EF将把OSM中的条目转换为相关的存储查询。

    你的代码看起来有点奇怪。你是否调试过(并运行了一个SQL跟踪)来查看实际执行的是什么?因为我不明白你为什么要先这么做 .Save ,因为与我的上述观点一致,因为您在方法的前几行中修改了实体,所以UPDATE语句很可能 执行,不考虑ID。

    我建议你重构你的代码来处理新的/修改的独立方法。(理想情况下通过存储库)

        2
  •  2
  •   Ashraf Alam    13 年前

    Employee Info Starter Kit ,您可以考虑如下代码段:

    public void UpdateEmployee(Employee updatedEmployee)
            {
                //attaching and making ready for parsistance
                if (updatedEmployee.EntityState == EntityState.Detached)
                    _DatabaseContext.Employees.Attach(updatedEmployee);
                _DatabaseContext.ObjectStateManager.ChangeObjectState(updatedEmployee, System.Data.EntityState.Modified);
                _DatabaseContext.SaveChanges();
            }