我正在构建REST API服务器端,我遇到了LINQ从数据库中获取数据的问题。我不知道我的模型类和关系是否以正确的方式构建,但我无法通过LINQ查询从数据库中获取数据。
我正在使用.NET核心(.NETCoreApp 1.1)。
我的模特:
用户类:
public class User
{
[Key]
public int IDUser { get; set; }
[Required]
public string Forename { get; set; }
[Required]
public string Name { get; set; }
public string AvatarPath { get; set; }
public string Email { get; set; }
public string PhoneNumber { get; set; }
public string Password { get; set; }
public User CreatedBy { get; set; }
public DateTime CreatedAt { get; set; }
public List<AccessCard> Cards { get; set; }
}
AccessCard类:
public class AccessCard
{
[Key]
public int IDAccessCard { get; set; }
[Required]
public string CardNumber { get; set; }
[Required]
public bool IsValid { get; set; }
public User User { get; set; }
public User AddedBy { get; set; }
[Required]
public DateTime CreatedAt { get; set; }
}
DBcontext类:
public class DBContext : DbContext
{
public DBContext(DbContextOptions<DBContext> options)
: base(options)
{}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AccessCard>()
.HasOne(i => i.User).WithMany(u => u.Cards);
base.OnModelCreating(modelBuilder);
}
public DbSet<AccessCard> AccessCards { get; set; }
public DbSet<User> Users { get; set; }
}
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
[HttpGet]
public async Task<IActionResult> GetUsers(string cardNr)
{
if (String.IsNullOrEmpty(cardNr))
{
var users = await _context.Users.ToListAsync();
if (users.Any())
{
return Json(users);
}
else
{
return NotFound();
}
}
else
{
var user = await _context.Users.FirstOrDefaultAsync(u => u.Cards.Exists(c => c.CardNumber.Equals(cardNr)));
if (user == null)
{
return NotFound();
}
else
{
return new ObjectResult(user);
}
}
}
//GET: api/users/1
[HttpGet("{id}")]
public async Task<IActionResult> GetUserByID(Int32 id)
{
var user = await _context.Users.FirstOrDefaultAsync(u => u.IDUser == id);
if (user == null)
{
return NotFound();
}
else
{
return new ObjectResult(user);
}
}
#endregion
}
我使用EntityFramework核心使用代码优先方法来构建我的数据库。我使用Package Manager Console来使用Add-Migration
然后使用Update-Database
命令来创建数据库。迁移成功创建了我的数据库。数据库服务器是本地MS SQL-Server。
我想要做的是通过其AccessCard号码获取用户。所以我在浏览器中尝试这个:
GET api / users?cardnr = qwe
哪个dosn没有给我任何回报....我用正确的外键手动将Users和AccessCards添加到数据库中,因此我的DB中的用户有100%的AccessCards。我的string cardNr
方法中的参数GetUsers
正确地填充了值(例如qwe)。
当我使用它时:
获取api / users
获取api / users / 1
获取api / accesscards
API成功返回数据,因此我的控制器正常工作。我分别得到所有用户,用户ID,所有访问卡。
当我尝试调试UsersController并在var user = await _context.Users.FirstOrDefaultAsync(u => u.Cards.Exists(c => c.CardNumber.Equals(cardNr)));
行设置陷阱时,代码只是退出方法并且不会返回任何内容。
我不知道模型类之间的关系是否正确构建。这是否能正确完成工作? :
modelBuilder.Entity<AccessCard>()
.HasOne(i => i.User).WithMany(u => u.Cards);
我是否必须通过DBcontext类添加任何其他内容以在User和AccessCard类之间建立正确的关系?基本上public List<AccessCard> Cards { get; set; }
集合应该返回给定用户的所有AccessCards。
请帮忙。 感谢