.net core 在WebApi中更新子实体的最佳实践是什么?

.net core 在WebApi中更新子实体的最佳实践是什么?,.net-core,entity-framework-core,asp.net-core-webapi,.net Core,Entity Framework Core,Asp.net Core Webapi,我的主要问题是,在WebApi中插入子实体后更新它们的最佳实践是什么 因为可以添加和删除一些子实体 情景: 假设我有两个实体: Quiz - id - name Questions - id - quizId - question 当我要添加带有一些问题的测验时,使用以下json: [ { "id": 0, "name": "Quiz 1", "questio

我的主要问题是,在WebApi中插入子实体后更新它们的最佳实践是什么

因为可以添加和删除一些子实体

情景: 假设我有两个实体:

    Quiz
     - id
     - name

    Questions
     - id
     - quizId
     - question
当我要添加带有一些问题的测验时,使用以下json:

    [
      {
        "id": 0,
        "name": "Quiz 1",
        "questions": [
        {
          "id": 0,
          "quizId": 0,
          "question": "question 1"
        },
        {
          "id": 0,
          "quizId": 0,
          "question": "question 2"
        },
        {
          "id": 0,
          "quizId": 0,
          "question": "question 3"
        }
       ]
      }
    ]
因此,在该实体解析我的ID并插入数据库之后

之后,用户决定删除“问题1”并添加“问题4”

因此,理论上要更新的json是:

    [
      {
        "id": 1,
        "name": "Quiz 1",
        "questions": [
        {
          "id": 2,
          "quizId": 1,
          "question": "question 2"
        },
        {
          "id": 3,
          "quizId": 1,
          "question": "question 3"
        },
        {
          "id": 0,
          "quizId": 1,
          "question": "question 4"
        }
       ]
      }
    ]

问题是:“问题1”仍在数据库中,但“问题4”已添加到数据库中。那么,如何删除“问题1”?

如果传递的数据中不包含现有问题,您可以对其进行预处理并将其删除:

 public async Task<IActionResult> PutQuiz(Quiz model)
    {
        var exsitQuiz = _context.Quizzes.Where(q => q.id == model.id)
            .Include(q => q.questions).SingleOrDefault();
        if (exsitQuiz != null)
        {
            foreach (var oldquestion in exsitQuiz.questions.ToList())
            {
                var flag = model.questions.Any(c => c.id == oldquestion.id);
                if (!flag)
                {
                    _context.Questions.Remove(oldquestion);
                    _context.SaveChanges();
                }
            }
        }
    }
公共异步任务PutQuike(测验模型)
{
var exsitquick=_context.Quizzes.Where(q=>q.id==model.id)
.Include(q=>q.questions).SingleOrDefault();
if(exsitquick!=null)
{
foreach(exsitquick.questions.ToList()中的var oldquestion)
{
var flag=model.questions.Any(c=>c.id==oldquestion.id);
如果(!标志)
{
_上下文。问题。删除(旧问题);
_SaveChanges();
}
}
}
}

Hi Rena,谢谢你的回复,我考虑过,这会解决问题,但仍然不是最好的方法。Hi@PauloGentile,如果你使用EF Core,据我所知,没有快速更新子实体的方法。如果你使用EF6,你可以使用GraphDiff。