2017-08-16 47 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表保存正確的新記錄)。我仍然有這個郵差錯誤 –