.net core 更新、创建或删除EF核心

.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;} }

我有一个API,我希望能够执行
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实体和请求实体。我同意这将是一个简单的手动解决方案,但我正在寻找一个更通用的解决方案,因为将有更多的集合和更多的模型。