在单个sql往返中更新相关实体

时间:2016-07-27 06:08:52

标签: entity-framework entity-framework-core

class Parent { Id, Name }
class Child { Id, Name, ParentId (notnull), Parent }

给定了Child对象的Id,我们必须更新其Parent的Name。所有这些都应该在单个sql往返中完成。类似的东西:

UPDATE Parent SET
  Name = 'New name'
WHERE Id = (SELECT ParentId FROM Child WHERE Id = @id)

1 个答案:

答案 0 :(得分:0)

通常情况下,如果实体之间有正确的关系,则从子实体获取Parent,更改名称并保存更改:

Parent parent = context.Childs
    .Where(m => m.Id == id)
    .Select(m => m.Parent)
    .First();

parent.Name = "New name";
context.SaveChanges();

但是如你所见,有两次往返:

First: Select
Second: Update.

至少据我所知,这是你能做到的唯一方法。但是,如果您确实需要一次查询数据库,可以尝试Raw Sql Queries。如果使用存储库模式,或者为上下文添加扩展方法,或者您希望如何更新数据,则可以将方法添加到存储库。例如:

public static void UpdateParentName(this DbContext context, 
    int childId, 
    string parentName)
{
    // validate inputs
    // ..........

    string sqlCommand = 
        "UPDATE Parent SET Name = {1} WHERE Id = (SELECT ParentId FROM Child WHERE Id = {0})";
    context.Database.ExecuteSqlCommand(sqlCommand, id, parentName);
}

然后调用此方法:

context.UpdateParentName(childId, "new name");