使用EF更新多对多的正确方法是什么?

时间:2014-12-05 12:16:15

标签: entity-framework

我很好奇一次更新实体列表的正确方法是什么。

    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只对数据库进行一次调用。枚举列表将导致多重更新语句。

2 个答案:

答案 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

希望这有帮助!