【问题标题】:EF Core Includes queryEF Core 包括查询
【发布时间】:2021-01-25 20:21:26
【问题描述】:

我正在尝试使用 SQLite 将用户实体保存到 EFCore 中的 Room 实体。保存更改后,我再次查询数据库以获取房间实体中更新的用户列表。目前,它返回 0 个用户,如果我在运行此查询后用断点停止代码并查看数据库表,我可以看到用户与正确的 Room 相关联,但我仍然有 0 个结果。我很好奇我的设计是否有问题?我需要将用户链接回房间的东西吗?

返回 0 个用户的代码 -

public async Task<ServiceResponse<MatchRoom>> RegisterUser(AppState state)
{
    //Update the db with connection ID incase we need it later
    var update = _context.Update(state.user);
    if (update != null)
    {
        //The user object is saved here
        await _context.SaveChangesAsync();
        //Here I query a room, that the user is assigned to, but get nothing.
        var room = _context.MatchRooms.Include("Users");
}

我有以下 dbcontext

public class DataContext : DbContext
{
    public DataContext(DbContextOptions<DataContext> options) : base(options)
    {
        //
    }
    
    public DbSet<User> Users { get; set; }
    public DbSet<MatchRoom> MatchRooms { get; set; }
    public DbSet<Message> Messages { get; set; }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MatchRoom>()
            .HasMany<User>(u => u.Users);
            
        modelBuilder.Entity<MatchRoom>()
            .HasMany<Message>(m => m.Messages);
            
        modelBuilder.Entity<Message>()
            .HasOne<User>(r => r.SentBy);
    }    
}

public class MatchRoom
{
    public int MatchRoomId { get; set; }
    public string MatchRoomCode { get; set; }
    [ValidateComplexType]
    public List<User> Users { get; set; } = new List<User>();
    public User CreatedBy { get; set; }
    public List<Message> Messages { get; set; }
}

public class User
{
    public int UserId { get; set; }
    public string UserCode { get; set; }
    [Required(ErrorMessage ="You must specify a username")]
    [StringLength(20,MinimumLength=1,ErrorMessage="Please enter a username no longer than 20 characters")]
    public string Username { get; set; }
    public string ConnectionId { get; set; }
}

public class Message
{
    public int MessageId { get; set; }
    public string Text { get; set; }
    public User SentBy { get; set; }
}

【问题讨论】:

    标签: c# entity-framework .net-core


    【解决方案1】:

    您只是声明查询,而不是执行它。

    更改以下行 -

    var room = _context.MatchRooms.Include("Users");
    

    到-

    var room = await _context.MatchRooms.Include(p=> p.Users).ToListAsync();
    

    这将为您提供所有 MatchRoom 及其相关 User 列表的列表。

    不确定如何查询已保存用户分配到的房间,因为我在 User 类中看不到任何可用于过滤查询的外键属性,例如 MatchRoomId。我猜现在它们正在由 EF 生成的影子密钥处理。

    User类中声明一个外键属性-

    public int MatchRoomId { get; set; }
    

    然后你可以查询一个房间,保存的用户被分配到like -

    var room = await _context.MatchRooms.Include(p=> p.Users).FirstOrDefaultAsync(p=> p.MatchRoomId == state.user.MatchRoomId)
    

    【讨论】:

    • 如何将 MatchRoomId 分配给用户类?只需添加一个属性?
    • 我认为您没有为User 表配置外键。你能分享你的实体配置代码吗?
    • 我所拥有的只是上面发布的 DBContext - 我会在那里添加它吗?还是您的意思是 DataContextModelSnapshot.cs?
    • @Parakoopa 在User 类中添加public int MatchRoomId { get; set; } 这个属性。然后创建新的迁移和新的数据库。
    • 谢谢,就是这样。看来我有一些学习要做。
    猜你喜欢
    • 2018-05-06
    • 2013-01-25
    • 2018-11-08
    • 2018-02-02
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多