Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF核心包括查询_C#_Entity Framework_.net Core - Fatal编程技术网

C# EF核心包括查询

C# EF核心包括查询,c#,entity-framework,.net-core,C#,Entity Framework,.net Core,我正在尝试将用户实体保存到EFCore w/SQLite中的文件室实体。保存更改后,我立即再次查询数据库,以获取文件室实体中更新的用户列表。当前,它返回0个用户,如果我在运行此查询并查看数据库表后用断点停止代码,我可以看到用户与正确的文件室相关联,但是我仍然有0个结果。我很好奇我的设计是否有问题?我需要将用户链接回房间的东西吗 返回0个用户的代码- public async Task<ServiceResponse<MatchRoom>> RegisterUser(App

我正在尝试将用户实体保存到EFCore w/SQLite中的文件室实体。保存更改后,我立即再次查询数据库,以获取文件室实体中更新的用户列表。当前,它返回0个用户,如果我在运行此查询并查看数据库表后用断点停止代码,我可以看到用户与正确的文件室相关联,但是我仍然有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");
}
公共异步任务注册器(AppState)
{
//用连接ID更新数据库,以备以后需要
var update=\u context.update(state.user);
如果(更新!=null)
{
//用户对象保存在此处
wait_context.SaveChangesAsync();
//这里我查询一个房间,用户被分配到这个房间,但什么也没有得到。
var room=_context.MatchRooms.Include(“用户”);
}
我有以下的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; }
}
公共类DataContext:DbContext
{
公共数据上下文(DbContextOptions):基本(选项)
{
//
}
公共数据库集用户{get;set;}
公共数据库集匹配室{get;set;}
公共数据库集消息{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasMany(u=>u.Users);
modelBuilder.Entity()
.HasMany(m=>m.Messages);
modelBuilder.Entity()
.HasOne(r=>r.SentBy);
}    
}
公务舱火柴房
{
public int MatchRoomId{get;set;}
公共字符串MatchRoomCode{get;set;}
[验证复杂类型]
公共列表用户{get;set;}=new List();
公共用户CreatedBy{get;set;}
公共列表消息{get;set;}
}
公共类用户
{
public int UserId{get;set;}
公共字符串用户代码{get;set;}
[必需(ErrorMessage=“您必须指定用户名”)]
[StringLength(20,MinimumLength=1,ErrorMessage=“请输入不超过20个字符的用户名”)]
公共字符串用户名{get;set;}
公共字符串连接ID{get;set;}
}
公共类消息
{
public int MessageId{get;set;}
公共字符串文本{get;set;}
公共用户SentBy{get;set;}
}

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

更改以下行-

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

这将为您提供所有
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)

如何将MatchRoomId分配给用户类?只需添加一个属性?我想您没有为
user
表配置外键。您可以共享您的实体配置代码吗?我所拥有的只是上面发布的DBContext-我会将其添加到那里吗?还是说DataContextModelSnapshot.cs?@Parakoopa add
public int MatchRoomId{get;set;}
用户
类中创建此属性。然后创建新迁移和新数据库。谢谢,就是这样。似乎我还有一些学习要做。
var room = await _context.MatchRooms.Include(p=> p.Users).FirstOrDefaultAsync(p=> p.MatchRoomId == state.user.MatchRoomId)