实体框架核心 - 如何处理相关实体映射和保存



我有两个相关的实体,它们是一对多关系,如下所示:

class parent{
public string parentName{get;set;}
public virtual ICollection<child> childs { get; set; }
}
class child{
public string childName{get;set;}
public parent parent{get;set;}
["ForeignKey"]
public int parentId {get; set;}
}
/// View Model
class VMParent{
public string parentName{get;set;}
/// a string array contains child name
public string[] childlist { get; set; }
}

假设我的父级目前包含 2 个名称为:(苹果、梨(的孩子,现在我想通过 web api 更新它以包含 3 个子级(苹果、子、香蕉(,请注意,这里删除了现有的子梨添加了 2 个新的子级(橙色、香蕉(,这里假设表子级中已经存在橙色,但香蕉不存在, 它应该被视为子表的新条目,我可以从 web api body View 模型的字符串数组(["苹果"、"橙子"、"香蕉"](中获取带有子名称的更新模型,例如:

[HttpPut("{id}")]
public async Task<IActionResult> Update(string name, [FromBody]VMParent VMUpdateParent)
{
if (ModelState.IsValid)
{
var existingParent = await _context.Parents
.Include(t => t.childs)
.SingleOrDefaultAsync(p => p.parentName == name);
existingParent.parentName = updateParent.parentName;
var childsToBeUpdated = updateParent.childList; /// ["apple","orange","banana"]
/// HOW TO HANDLE or REBUILD the relationship that can
/// 1) remove child (pear) from existingParent
/// 2) add child "banana" to Child table
/// 3) add childs (orange and banana) to existingParent?
......
_context.Parents.Update(existingParent);
await _context.SaveChangesAsync();
return new NoContentResult();
}
return BadRequest(ModelState);
} 

是否有任何"MERGE"语句,如实体框架核心中的 SQL ?我真的很期待在使用实体框架的实际应用程序中提供更多教程......

我自己想出了一个解决方案,通过在视图模型VMUpdateParent与现有模型existingParent之间使用自动映射器删除不必要的子节点并添加新的子节点。

但是,如果有人有任何改进或更好的解决方案,请随时在此处分享。提前感谢!

相关内容

  • 没有找到相关文章

最新更新