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

时间:2018-06-07 05:17:36

标签: c# entity-framework entity-framework-core savechanges

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

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个名字的孩子:( apple,pear ),现在我想通过web api更新它以包含3个孩子( apple,orange,banana ),请注意已存在的子梨被移除并且添加了2个新的孩子(橙色,香蕉),这里假设橙子已经存在于桌子中但香蕉不存在,它应被视为子表的新条目,我可以在字符串数组中使用子名称获取更新的模型( [“apple”,“orange”,“banana”] )来自web api body查看模型如:

[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);
} 

是否有像Entity Framework Core中的SQL一样的“MERGE”语句?我非常期待使用Entity Framework在实际应用程序中获得更多教程...

1 个答案:

答案 0 :(得分:0)

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

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