类 entityframeworkcore code-first 之间的关系

Relations between classes entityframeworkcore code-first

我是 entity framework 核心的初学者,但我之前通过先创建数据库来使用 Linq SQL。 我正在尝试先用实体编写代码。

我有一个包含多个表的数据库,无法弄清楚为什么我不能使用 class 之间的关系。

简单案例: 我有一个 Class 聊天,与 class 用户的多对多关系有关。

聊天class

public int Id { get; set; }
public int StarterUserId { get; set; }
public User StarterUser { get; set; }
public int OtherUserId { get; set; }
public User OtherUser { get; set; }

用户 class 有一个 ID 属性。

public int Id { get; set; }
public List<Chat> InChats { get; set; }
public List<Chat> OutChats { get; set; }

并且我在 OnModelCreating 方法中定义了:

modelBuilder.Entity<Chat>()
            .HasOne(x => x.StarterUser)
            .WithMany(m => m.OutChats)
            .HasForeignKey(x => x.StarterUserId);
modelBuilder.Entity<Chat>()
            .HasOne(x => x.OtherUser)
            .WithMany(m => m.InChats)
            .HasForeignKey(x => x.OtherUserId);

当我得到一个 Chat 对象并观察它的属性时,我有 OtherUser 作为 User class 的对象,并且 OtherUserId=26(好)

但是我有 StarterUserId=1 我有 StarterUser as null.

在数据库中我可以看到正确定义的关系。 StarterUserIdOtherUserId 都是 Users Table

中的外键

这是为什么?我该如何解决这个问题?

已解决:我启用了延迟加载,但我无法获取相关数据。

  1. 我从 nuget
  2. 安装了 Microsoft.EntityFrameworkCore.Proxies
  3. 添加 DbContext 时,我使用 .UseLazyLoadingProxies()
  4. 启用了延迟加载
  5. 将我需要获取相关数据的属性的修饰符从 public 更改为 public virtual

问题出在您的查询中,但您没有将您的查询添加到问题中!!。我假设您缺少 eager-loading 相关实体。

因此您必须在查询中使用 .Inlcude 预先加载 OtherUser,您的查询应如下所示:

_dbContext.Chats.Include(c => c.StarterUser)
                .Include(c => c.OtherUser).Where(c => c.Id == 1).FirstOrDefault();

更多详情:Loading Related Data in EF Core