我是实体框架核心的初学者,但我之前通过创建数据库使用了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
。
在数据库中,我可以看到正确定义的关系。 StarterUserId
和OtherUserId
都是Users
表中的外键
这是为什么?我怎样才能解决这个问题?
解决:我启用了延迟加载,而不是我可以得到相关数据。
Microsoft.EntityFrameworkCore.Proxies
包DbContext
添加我的.UseLazyLoadingProxies()
I启用延迟加载时public
更改为public virtual
,以获取获取相关数据所需的属性问题在您的查询中,但您没有将查询添加到问题!!我假设你缺少相关实体的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