Entity Framework核心-如何处理相关实体映射和保存
Entity Framework Core - How to handle Related Entity Mapping and Saving
我有两个相关实体 one-to-many 关系如下:
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; }
}
假设我的 parent 当前包含 2 个 child 名称:(apple, pear),现在我想通过网络更新它 api 包含 3 child (apple, orange, banana),注意这里 existed child pear is removed并添加了2 new child(orange, banana),这里假设orange已经存在于table child中,而banana不存在,应该认为是新的进入 child table,我可以在字符串数组中使用 child 的名称获取我的更新模型(["apple", "orange", "banana"]) 来自网络 api body View Model like:
[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" 语句?我真的很期待 real-world 应用程序中的更多教程 Entity Framework...
我自己找到了一个解决方案,方法是在视图模型 VMUpdateParent 与现有模型 existingParent[ 之间使用 AutoMapper =18=] 到 删除不必要的子节点并添加新的子节点。
但是,如果有人有任何改进或更好的解决方案,请随时在这里分享。提前致谢!
我有两个相关实体 one-to-many 关系如下:
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; }
}
假设我的 parent 当前包含 2 个 child 名称:(apple, pear),现在我想通过网络更新它 api 包含 3 child (apple, orange, banana),注意这里 existed child pear is removed并添加了2 new child(orange, banana),这里假设orange已经存在于table child中,而banana不存在,应该认为是新的进入 child table,我可以在字符串数组中使用 child 的名称获取我的更新模型(["apple", "orange", "banana"]) 来自网络 api body View Model like:
[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" 语句?我真的很期待 real-world 应用程序中的更多教程 Entity Framework...
我自己找到了一个解决方案,方法是在视图模型 VMUpdateParent 与现有模型 existingParent[ 之间使用 AutoMapper =18=] 到 删除不必要的子节点并添加新的子节点。
但是,如果有人有任何改进或更好的解决方案,请随时在这里分享。提前致谢!