.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; }
}
UsersController
のHttpPost
メソッドに問題があります。 「通常の」POSTを実行して、グループに割り当てないで追加するユーザー(空のuserGroupIDパラメーター)を含むJSONオブジェクトを渡すと、すべてが正常です。ユーザーはDataBaseに追加され、PostmanはIDを持つユーザーを返します。
と私は、新しいユーザーを追加しようとするが、特定のグループに追加することで、私は常にエラーを取得:
でも、そのエラーにもかかわらず、新しいユーザーがDBに正しく追加され、そのグループに関連付けられます(レコードはUserGroupテーブルに追加され、UserGroupはUsersテーブルとGroupsテーブルの間の結合テーブルです)。だから私は自分のDBに適切なデータを持っていますが、私はいつもこのエラーを受け取り、APIを呼び出し、自分のIDを取得できないクライアントに新しい追加ユーザーを返すことはできません。 CreateUser
メソッドで何か問題が起きていますか?
UPDATE:
私はUsersController
でCreateUser
方法で "HERE NOTE" にコメント行を追加しました。私がこの行全体をコメントすると、私はPostmanからエラーが出ることはありませんが、私のユーザーはそのグループに関連付けられていません(私はUserGroup join tableに新しいレコードを追加しません)。だから、エラーを引き起こすコンテキストオブジェクトの別のAdd
メソッドのように思えます...それは理にかなっていますか?
こんにちはアンドレイを助けることができる方法を知っているか教えてください。ご回答有難うございます。はい私は私のアプリをデバッグしようとしました。 'if(userToCreate == null)'は常にfalseを返します。これは、ユーザーが 'CreateUser'メソッドに正しく渡されたことを意味します。さらに、DBに正しく追加され、正しくグループに割り当てられます(UserGroupテーブルは正しい新しいレコードを保存します)。私はまだこのPostmanのエラーがあります –