我很好奇一次更新实体列表的正确方法是什么。
public ActionWas Update(IEnumerable<surcharge_template> templates)
{
try
{
var templatesToBeUpdated = _context.surcharge_template.Where(x => templates.Select(template => template.st_key).Contains(x.st_key));
//Right here I need to map all of the differences from the original templates
//to the new templates
_context.Entry(templatesToBeUpdated).State = EntityState.Modified;
}
catch (Exception ex)
{
return _exceptionConverter.Convert(ex);
}
_context.SaveChanges();
return ActionWas.Successsful;
}
我发表评论,我不知道如何处理这个问题。我从数据库中获取原始模板,然后我需要映射它们,然后提交并保存。
那么映射它们的正确方法是什么?
更新:
我想用EF只对数据库进行一次调用。枚举列表将导致多重更新语句。
答案 0 :(得分:1)
您无需映射当前实体。您可以使用类似SQL Update的语法。
使用EntityFramework.Extended
//update all tasks with status of 1 to status of 2
context.Templates.Update(
t => t.StatusId == 1,
t2 => new Template {StatusId = 2});
这只是一种解决方法,如果您需要对修改实体状态所需的每个模板进行不同的更改,最后只是一种解决方法。
答案 1 :(得分:0)
Attach方法不附加子实体。为此,您需要附加要更新的所有依赖项目标。您可以使用GraphDiff更新完整图形而无需附加实体。用法是这样的:
using (var context = new TestDbContext())
{
// Update the company and state that the company 'owns' the collection Contacts.
context.UpdateGraph(company, map => map
.OwnedCollection(p => p.Contacts, with => with
.AssociatedCollection(p => p.AdvertisementOptions))
.OwnedCollection(p => p.Addresses)
);
context.SaveChanges();
}
这是框架的brief introduction。
希望这有帮助!