模型类与通过LINQ返回数据之间的关系

时间:2017-07-27 12:02:13

标签: entity-framework linq rest .net-core entity-framework-core

我正在构建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)。

enter image description here enter image description here

当我使用它时:

获取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。

请帮忙。 感谢

0 个答案:

没有答案