我目前正在插入/更新这样的字段(如果有更好的方式,请说出来 - 我们总是在学习)
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次保存到数据库,但最后只需保存一次。
谢谢。
答案 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();
}