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
相关产品推荐
相关产品推荐

