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

时间:2010-11-09 08:50:11

标签: entity-framework ado.net entity-framework-4

我目前正在插入/更新这样的字段(如果有更好的方式,请说出来 - 我们总是在学习)

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
}

如您所见有2次 this.Save()(女巫调用db.SaveChanges();

添加时,我们使用AddObject方法将新对象放入 Place Holder ,换句话说,新对象不会立即提交我们可以放置任意数量的物品。

但是当它是一个更新时,我需要首先保存才能继续下一个对象,是否有一种方法可供我使用,让我们说:

        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次更新,我需要5次保存到数据库,但最后只需保存一次。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果您有一个附加到图表的对象,如果修改此对象的值,则该实体将标记为已修改

如果您只是执行.AddObject,则该实体会标记为已添加

还没有发生任何事情 - 只是暂存图表。

然后,当您执行SaveChanges()时,EF会将OSM中的条目转换为相关的商店查询。

您的代码看起来有点奇怪。您是否通过调试(并运行SQL跟踪)来查看实际执行的内容?因为我不明白为什么你需要第一个.Save,因为内联我的上述几点,因为你修改方法的前几行中的实体,UPDATE语句很可能总是

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

答案 1 :(得分:2)

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();
        }