2017-08-16 14 views
0

.NETコアにREST APIサーバーを構築し、Postmanソフトウェアを使用してテストしています。 CreateUserメソッドのDBContextクラスで2番目の追加操作を実行しようとすると、私に値を返さないPOSTメソッド( "応答を取得できませんでした")に問題があります。私のコード:REST API - CreatedAtRouteメソッドが値を返さない

がUserController:

[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 
} 

Userモデル:

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

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

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

のUserGroupモデル:

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; } 
} 

UsersControllerHttpPostメソッドに問題があります。 「通常の」POSTを実行して、グループに割り当てないで追加するユーザー(空のuserGroupIDパラメーター)を含むJSONオブジェクトを渡すと、すべてが正常です。ユーザーはDataBaseに追加され、PostmanはIDを持つユーザーを返します。

画面: https://pasteboard.co/GFUgMeM.png

と私は、新しいユーザーを追加しようとするが、特定のグループに追加することで、私は常にエラーを取得:

画面: enter image description here

でも、そのエラーにもかかわらず、新しいユーザーがDBに正しく追加され、そのグループに関連付けられます(レコードはUserGroupテーブルに追加され、UserGroupはUsersテーブルとGroupsテーブルの間の結合テーブルです)。だから私は自分のDBに適切なデータを持っていますが、私はいつもこのエラーを受け取り、APIを呼び出し、自分のIDを取得できないクライアントに新しい追加ユーザーを返すことはできません。 CreateUserメソッドで何か問題が起きていますか?

UPDATE

私はUsersControllerCreateUser方法で "HERE NOTE" にコメント行を追加しました。私がこの行全体をコメントすると、私はPostmanからエラーが出ることはありませんが、私のユーザーはそのグループに関連付けられていません(私はUserGroup join tableに新しいレコードを追加しません)。だから、エラーを引き起こすコンテキストオブジェクトの別のAddメソッドのように思えます...それは理にかなっていますか?

答えて

0

デバッグしようとしましたか?

if (userToCreate == null) 

がポストマンとの要求を再送信し、アプリをデバッグ:

は、行にブレークポイントを設定します。そこに何がどこで間違っているのかを見ることができます。

私はそのように起こっている、私はあなた:)

+0

こんにちはアンドレイを助けることができる方法を知っているか教えてください。ご回答有難うございます。はい私は私のアプリをデバッグしようとしました。 'if(userToCreate == null)'は常にfalseを返します。これは、ユーザーが 'CreateUser'メソッドに正しく渡されたことを意味します。さらに、DBに正しく追加され、正しくグループに割り当てられます(UserGroupテーブルは正しい新しいレコードを保存します)。私はまだこのPostmanのエラーがあります –

関連する問題