【问题标题】:Trying to insert multiple rows ASP Web API with Postman in JSON尝试在 JSON 中使用 Postman 插入多行 ASP Web API
【发布时间】:2020-12-13 14:24:25
【问题描述】:

我想使用 ASP Web Api 将电影列表插入到我的数据库中。当我从 JSON 插入单个值时,我的代码可以工作,但是当我将其放在冒号中时,它不会。我不确定我在 MoviesTicketDTO 中的数据类型是否必须列出。到目前为止,这是我的代码:

EfCreateMovieCommand.cs

public void Execute(MoviesTicketDTO request)
{

    MovieDTO temp = new MovieDTO();
    temp.Name = request.MovieName;

    validator.ValidateAndThrow(temp);

    var movie = new Movies
    {
        Name=request.MovieName
    };

    _context.Movies.Add(movie);
    _context.SaveChanges();

MovieTicketDTO.cs

public class MoviesTicketDTO
{
    public string MovieName { get; set; }
}

这是我在 Postman 中收到的错误消息:

【问题讨论】:

  • 当你“把它放在冒号里”?你是说括号吗?因为看起来MovieName 需要是一个列表而不是一个字符串,并且需要括号
  • 将`public string MovieName`更改为public List<string> MovieName
  • 当我将其更改为 Listprntscr.com/u58q3u 时出现此错误
  • 确保MovieDTO 也是List<string> Name 的类
  • 数据库是否必须具有一定的结构,因为我仍然遇到错误?

标签: c# linq asp.net-web-api


【解决方案1】:

首先,在 MoviesTicketDTO 类中将 MovieName 更改为 List<string>string[]

其次,将Execute方法改为:

    [HttpPost]
    public void Execute([FromBody] MoviesTicketDTO request)
    {
       // blabla
    }

最后,更新了postman中的post模型:

【讨论】:

    【解决方案2】:

    好的,假设我们不想更改您已有的 Execute 方法和 MoviesTicketDTO 类的逻辑。

    但首先,我们可以理解您的 Postman 为何会抛出错误。
    原因很简单,因为您的 Controller 方法需要一个具有单个字符串属性元素的类(MoviesTicketDTO 有一个属性MovieName,即string),但它从 Postman 调用中获取字符串集合。

    现在,如果我们假设 Execute 方法按预期工作,您可以使用以下 API 方法:

    [HttpPost]
    public void UpdateMovies(MoviesTicketChangeModel model)
    {
      // you are calling the business layer method here
    }
    

    MoviesTicketChangeModel 在哪里:

    public class MoviesTicketChangeModel 
    {
        public List<string> MovieNames { get; set; }
    }
    

    接下来,无需更改现有的 MoviesTicketDTO 模型,您可以在业务层代码中创建另一个接受 MoviesTicketChangeModel 模型的方法,并迭代内部集合,以您之前调用的方式调用 Execute 方法:

    public void UpdateMovieTickets(MoviesTicketChangeModel model) 
    {
        foreach(var movieName in model.MovieNames) 
        {
           Execute(new MoviesTicketDTO { name = movieName });
        }
    }
    

    这里要记住的一件事是组织异常处理,因为您需要问自己,如果一部电影可能无法更新,但其他电影成功,这没关系。


    替代上述调用的另一种方法是创建 SQL 存储过程并将字符串数组传递给它。

    如果您不想处理 SP,但希望通过 Entity Framework 一次更新一堆项目,请使用 AddRange 方法,但在这种情况下,您将不得不稍微更改您的 Execute 逻辑.


    还有一件事:在您的 Execute 代码中,我认为在将电影添加到您的电影表之前检查电影是否不存在是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-29
      相关资源
      最近更新 更多