类 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
.
在数据库中我可以看到正确定义的关系。
StarterUserId
和 OtherUserId
都是 Users
Table
中的外键
这是为什么?我该如何解决这个问题?
已解决:我启用了延迟加载,但我无法获取相关数据。
- 我从 nuget
安装了 Microsoft.EntityFrameworkCore.Proxies
包
- 添加
DbContext
时,我使用 .UseLazyLoadingProxies()
启用了延迟加载
- 将我需要获取相关数据的属性的修饰符从
public
更改为 public virtual
问题出在您的查询中,但您没有将您的查询添加到问题中!!。我假设您缺少 eager-loading
相关实体。
因此您必须在查询中使用 .Inlcude
预先加载 OtherUser
,您的查询应如下所示:
_dbContext.Chats.Include(c => c.StarterUser)
.Include(c => c.OtherUser).Where(c => c.Id == 1).FirstOrDefault();
我是 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
.
在数据库中我可以看到正确定义的关系。
StarterUserId
和 OtherUserId
都是 Users
Table
这是为什么?我该如何解决这个问题?
已解决:我启用了延迟加载,但我无法获取相关数据。
- 我从 nuget 安装了
- 添加
DbContext
时,我使用.UseLazyLoadingProxies()
启用了延迟加载
- 将我需要获取相关数据的属性的修饰符从
public
更改为public virtual
Microsoft.EntityFrameworkCore.Proxies
包
问题出在您的查询中,但您没有将您的查询添加到问题中!!。我假设您缺少 eager-loading
相关实体。
因此您必须在查询中使用 .Inlcude
预先加载 OtherUser
,您的查询应如下所示:
_dbContext.Chats.Include(c => c.StarterUser)
.Include(c => c.OtherUser).Where(c => c.Id == 1).FirstOrDefault();