2017-08-16 131 views
0

我在.NET Core中构建了一些REST API服务器,并使用Postman软件来测试它。当我尝试对CreateUser方法内的DBContext类执行第二次添加操作时,我遇到POST方法的问题,它不会返回任何值(“无法获得任何响应”)。我的代码:REST API - CreatedAtRoute方法不返回值

UsersController:

[Produces("application/json")] 
[Route("api/[controller]")] 
public class UsersController : Controller 
{ 
    private readonly DBContext _context; 

    #region CONSTRUCTOR 

    public UsersController(DBContext context) 
    { 
     _context = context; 
    } 

    #endregion 

    #region HTTP GET 

    // GET: api/users || api/users?cardnr=xxx 
    [HttpGet] 
    public async Task<IActionResult> GetUsers(string cardNr) 
    { 
     if (String.IsNullOrEmpty(cardNr)) 
     { 
      try 
      { 
       var users = await _context.Users.ToListAsync(); 

       if (users.Any()) 
       { 
        return Json(users); 
       } 
       else 
       { 
        return NotFound(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Helpers.ExceptionLogger.LogException(ex); 
       return StatusCode(500); 
      } 
     } 
     else 
     { 
      try 
      { 
       var user = await _context.Users.FirstOrDefaultAsync(u => u.Cards.Any(c => c.CardNumber.Equals(cardNr))); 

       if (user == null) 
       { 
        return NotFound(); 
       } 
       else 
       { 
        return new ObjectResult(user); 
       } 
      } 
      catch (Exception ex) 
      { 
       Helpers.ExceptionLogger.LogException(ex); 
       return StatusCode(500); 
      } 
     } 
    } 

    //GET: api/users/1 
    [HttpGet("{id}", Name = "GetUserByID")] 
    public async Task<IActionResult> GetUserByID(Int32 id) 
    { 
     try 
     { 
      var user = await _context.Users.FirstOrDefaultAsync(u => u.IDUser == id); 

      if (user == null) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       return new ObjectResult(user); 
      } 
     } 
     catch (Exception ex) 
     { 
      Helpers.ExceptionLogger.LogException(ex); 
      return StatusCode(500); 
     } 
    } 

    #endregion 

    #region HTTP POST 

    [HttpPost] 
    public async Task<IActionResult> CreateUser([FromBody] Models.User userToCreate, string userGroupID) 
    { 
     if (userToCreate == null) 
     { 
      return BadRequest(); 
     } 
     else 
     { 
      try 
      { 
       _context.Users.Add(userToCreate); 

       int parsingResult; 

       // if user passed userGroupID 
       if (userGroupID != null) 
       { 
        // parsing if userGroupID is a number 
        if (!int.TryParse(userGroupID, out parsingResult)) 
        { 
         return BadRequest(); 
        } 
        else 
        { 
         // if client want to assign a new user to some group 
         if (parsingResult > 0) 
         { 
          // creating new record in UserGroup table - assigning a user to group 
          var userGroup = new Models.UserGroup(); 
          _context.Entry(userGroup).Property("IDGroup").CurrentValue = parsingResult; 
          _context.Entry(userGroup).Property("IDUser").CurrentValue = userToCreate.IDUser; 

          _context.UserGroups.Add(userGroup); // NOTE HERE 
         } 
        } 
       } 

       await _context.SaveChangesAsync(); 

       return CreatedAtRoute("GetUserByID", new { id = userToCreate.IDUser }, userToCreate); 
      } 
      catch (Exception ex) 
      { 
       Helpers.ExceptionLogger.LogException(ex); 
       return StatusCode(500); 
      } 
     } 
    } 

    #endregion 
} 

用户模式:

public class User 
{ 
    [Key] 
    public int IDUser { get; set; } 

    [Required] 
    public string Name { get; set; } 

    public List<UserGroup> UsersGroups { get; set; } 
} 

用户组型号:

public class UserGroup 
{ 
    public Group Group { get; set; } 
    public User User { get; set; } 
} 

的DbContext类:

public class DBContext : DbContext 
{ 
    public DBContext(DbContextOptions<DBContext> options) 
     : base(options) 
    { 

    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     // shadow property - foreign key 
     modelBuilder.Entity<UserGroup>() 
      .Property<int>("IDUser"); 

     // shadow property - foreign key 
     modelBuilder.Entity<UserGroup>() 
      .Property<int>("IDGroup"); 

     modelBuilder.Entity<UserGroup>() 
      .HasKey(new string[]{ "IDUser", "IDGroup" }); 

     modelBuilder.Entity<UserGroup>() 
      .HasOne(ug => ug.Group) 
      .WithMany(g => g.UsersGroups) 
      .HasForeignKey("IDGroup"); 

     modelBuilder.Entity<UserGroup>() 
      .HasOne(ug => ug.User) 
      .WithMany(u => u.UsersGroups) 
      .HasForeignKey("IDUser"); 

     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<Group> Groups { get; set; } 
    public DbSet<User> Users { get; set; } 
    public DbSet<UserGroup> UserGroups { get; set; } 
} 

问题出在HttpPost方法UsersController。 当我做“普通”的POST和传递JSON对象,其中包含用户添加,而不分配给组(空userGroupID参数)一切都没事 - 用户被添加到数据库和邮递员返回给我一个用户与它的ID。

屏幕: https://pasteboard.co/GFUgMeM.png

,当我尝试添加一个新用户,但与它添加到特定的组,我总是得到一个错误:

屏幕: enter image description here

即使尽管错误新用户正确添加到数据库并与其组关联(记录被添加到UserGroup表; UserGroup是用户和组表之间的连接表)。所以我在我的数据库中有适当的数据,但我总是得到这个错误,我不能将新增的用户返回给调用API的客户端,并且无法获得他的ID。我在CreateUser方法中做错了什么?

UPDATE

我在UsersControllerCreateUser方法加入 “注意,这里” 注释行。如果我评论整个这一行,我没有从邮差中得到一个错误,但显然我没有让我的用户与其组相关联(我没有将新记录添加到UserGroup连接表中)。所以它看起来像另一个Add方法上下文对象导致错误...是否有道理?

回答

0

你试过调试它吗?

设置该行断点:

if (userToCreate == null) 

再次发送请求,在与邮差和调试应用程序。在那里你可以看到哪里出了问题。

请让我知道它是怎么回事,所以我知道我该怎么帮你:)

+0

嗨安德烈。感谢您的回答。是的,我已经尝试调试我的应用程序和'if(userToCreate == null)'总是返回false,这意味着用户正确传递给'CreateUser'方法。此外,它已正确添加到数据库并正确分配给组(UserGroup表保存正确的新记录)。我仍然有这个邮差错误 –