You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6/EF Core双向关联异常:User集合属性始终为空

问题描述

定义了User和Friendship两个模型,Friendship中关联RequestUser或ReceiveUser时能获取正确数据,但User中的RequestedFriendships和ReceivedFriendships集合始终为空(数据库中存在对应关联数据),求解决办法。

模型代码

public class User
{
    public int Id { get; set; }
    public string? Email { get; set; }
    public string? Password { get; set; }

    public virtual ICollection<Friendship> RequestedFriendships { get; set; }
    public virtual ICollection<Friendship> ReceivedFriendships { get; set; }
}

public class Friendship
{
    public int Id { get; set; }

    public int? RequestUserId { get; set; }
    public int? ReceiveUserId { get; set; }

    public FriendshipStatus Status { get; set; }
    public DateTime CreationDate { get; set; }
    public DateTime? UpdatedDate { get; set; }
    public virtual User RequestUser { get; set; }
    public virtual User ReceiveUser { get; set; }
}

Fluent API配置代码

modelBuilder.Entity<Friendship>()
            .HasOne(f => f.RequestUser)
            .WithMany(u => u.RequestedFriendships)
            .HasForeignKey(f => f.RequestUserId)
            .OnDelete(DeleteBehavior.ClientSetNull);

modelBuilder.Entity<Friendship>()
            .HasOne(f => f.ReceiveUser)
            .WithMany(u => u.ReceivedFriendships)
            .HasForeignKey(f => f.ReceiveUserId)
            .OnDelete(DeleteBehavior.ClientSetNull);
解决方案
  • 启用延迟加载或显式预加载关联集合
    你的导航属性已标记为virtual,但EF Core默认不启用延迟加载代理。可在DbContext的OnConfiguring方法中开启:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies()
                      .UseSqlServer("你的数据库连接字符串");
    }
    

    若不想使用延迟加载,查询User时必须显式通过Include预加载关联集合:

    var targetUser = dbContext.Users
        .Include(u => u.RequestedFriendships)
        .Include(u => u.ReceivedFriendships)
        .FirstOrDefault(u => u.Id == 目标用户ID);
    }
    
  • 验证数据库外键与数据有效性
    确认Friendship表的RequestUserId和ReceiveUserId外键正确关联到User表的Id字段,同时检查数据库中这些外键值是否对应存在的User记录,避免无效ID导致关联失效。

  • 确认DbContext已注册实体
    确保DbContext中声明了对应的DbSet:

    public class YourDbContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Friendship> Friendships { get; set; }
    
        // 其他配置代码
    }
    

内容的提问来源于stack exchange,提问作者Mortimen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:20:36