我正在尝试将用户实体保存到带有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; }
}
您仅声明查询,而不执行查询。
更改以下行-
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; }
然后,您可以查询一个房间,将已保存的用户分配为-
var room = await _context.MatchRooms.Include(p=> p.Users).FirstOrDefaultAsync(p=> p.MatchRoomId == state.user.MatchRoomId)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句