类entityframeworkcore代码优先于代码之间的关系

问题描述 投票:0回答:1

我是实体框架核心的初学者,但我之前通过创建数据库使用了Linq to SQL。我试图先用实体编写代码。

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

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

聊天课

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; }

用户类具有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类的对象,并且OtherUserId=26(GOOD)

但我有StarterUserId=1,我有StarterUser as null

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

这是为什么?我怎样才能解决这个问题?

解决:我启用了延迟加载,而不是我可以得到相关数据。

  1. 我从nuget安装了Microsoft.EntityFrameworkCore.Proxies
  2. 当使用DbContext添加我的.UseLazyLoadingProxies()I启用延迟加载时
  3. 将修改器从public更改为public virtual,以获取获取相关数据所需的属性
c# ef-code-first entity-framework-core lazy-loading eager-loading
1个回答
0
投票

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

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

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

有关更多详细信息:Loading Related Data in EF Core

© www.soinside.com 2019 - 2024. All rights reserved.