【问题标题】:Whats is the best practice to update child entities in a WebApi?在 Web Api 中更新子实体的最佳做法是什么?
【发布时间】:2020-01-14 15:46:36
【问题描述】:

我的主要问题是 WebApi 在插入子实体后更新子实体的最佳做法是什么。

因为可以添加一些子实体,也可以删除一些子实体。

场景: 假设我有 2 个实体:

    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”呢?

【问题讨论】:

    标签: .net-core entity-framework-core asp.net-core-webapi


    【解决方案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();
                    }
                }
            }
        }
    

    【讨论】:

    • 嗨 Rena,感谢您的回复,我考虑过,这可以解决问题,但仍然不是最好的方法。
    • 嗨@PauloGentile,如果您使用EF Core,据我所知没有快速更新子实体的方法。如果您使用EF6,您可以使用GraphDiff。 github.com/refactorthis/GraphDiff
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2017-05-22
    • 1970-01-01
    • 2017-06-26
    • 2012-04-28
    相关资源
    最近更新 更多