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