.net core 更新、创建或删除EF核心
我有一个API,我希望能够执行.net core 更新、创建或删除EF核心,.net-core,entity-framework-core,.net Core,Entity Framework Core,我有一个API,我希望能够执行PUT请求,在那里我发布一个计划,其中包含一系列块。现在,它会自动添加新的Block条目并更新现有条目,但如果帖子中缺少条目,它不会删除这些条目 这些是模型: 公共课程计划 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共ICollection块{get;set;} } 公共类街区 { 公共int Id{get;set;} 公共字符串名称{get;set;} 公共整数平面ID{get;set;} 公共计划计划{get;set;} }
PUT
请求,在那里我发布一个计划
,其中包含一系列块
。现在,它会自动添加新的Block
条目并更新现有条目,但如果帖子中缺少条目,它不会删除这些条目
这些是模型:
公共课程计划
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection块{get;set;}
}
公共类街区
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数平面ID{get;set;}
公共计划计划{get;set;}
}
以及控制器动作:
[HttpPut]
公共行动结果更新(计划)
{
如果(plan?.Id==null)返回BadRequest();
var plans=_context.plans.Count(p=>p.Id==plan.Id);
如果(plans!=1)返回NotFound();
_更新(计划);
_SaveChanges();
返回NoContent();
}
我将如何着手实施这一点?EF中是否有启用此功能的设置
我正在寻找一个通用的解决方案,因为将有更多的集合和模型需要相同的功能。我不想对每个控制器/操作都进行编程
我正在使用.net Core 2.2上的Entity Framework Core因为您保留了主体实体(在您的情况下是
计划),所以您应该手动删除已删除的子实体(块
):
[HttpPut]
公共行动结果更新(计划)
{
如果(plan?.Id==null)返回BadRequest();
var plans=_context.plans.Count(p=>p.Id==plan.Id);
如果(plans!=1)返回NotFound();
var oldBlocks=_context.Blocks.Where(b=>b.PlanId==plan.Id);
foreach(旧块中的var块)
{
如果(!plan.Blocks.Any(b=>b.Id==block.Id))
_context.Entry(block.State=EntityState.Deleted;
}
_更新(计划);
_SaveChanges();
返回NoContent();
}
以下解决方案更干净
[HttpPut]
public ActionResult Update(Plan plan)
{
if (plan?.Id == null) return BadRequest();
var oldPlan = _context.Plans
.Where(p => p.Id == plan.Id)
.Include(p => p.Blocks)
.FirstOrDefault();
if (oldPlan == null) return NotFound();
oldPlan.Name = plan.Name;
oldPlan.Blocks = plan.Blocks; //This will wipe out all the existing blocks and replace with new ones. If blocked are null it will just deleted all the existing blocks.
_context.SaveChanges(); //No need of _context.Update(plan);
return NoContent();
}
您可以在更新计划
实体的地方添加代码示例吗?@Fourat当然,我添加了它在类似的情况下,我必须创建一个UpdateEntity方法,该方法接受db实体和请求实体。我同意这将是一个简单的手动解决方案,但我正在寻找一个更通用的解决方案,因为将有更多的集合和更多的模型。