我在.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。
,当我尝试添加一个新用户,但与它添加到特定的组,我总是得到一个错误:
即使尽管错误新用户正确添加到数据库并与其组关联(记录被添加到UserGroup表; UserGroup是用户和组表之间的连接表)。所以我在我的数据库中有适当的数据,但我总是得到这个错误,我不能将新增的用户返回给调用API的客户端,并且无法获得他的ID。我在CreateUser
方法中做错了什么?
UPDATE:
我在UsersController
在CreateUser
方法加入 “注意,这里” 注释行。如果我评论整个这一行,我没有从邮差中得到一个错误,但显然我没有让我的用户与其组相关联(我没有将新记录添加到UserGroup连接表中)。所以它看起来像另一个Add
方法上下文对象导致错误...是否有道理?
嗨安德烈。感谢您的回答。是的,我已经尝试调试我的应用程序和'if(userToCreate == null)'总是返回false,这意味着用户正确传递给'CreateUser'方法。此外,它已正确添加到数据库并正确分配给组(UserGroup表保存正确的新记录)。我仍然有这个邮差错误 –