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)
答案 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");