C# 实体框架核心关系集合为空
我做了一个数据库优先的方法,我做了我的数据库。我使用关系,我有两个表:C# 实体框架核心关系集合为空,c#,entity-framework-core,ef-database-first,C#,Entity Framework Core,Ef Database First,我做了一个数据库优先的方法,我做了我的数据库。我使用关系,我有两个表: users ------------- id PK int(11) username UNIQUE varchar(20) rooms ------------- id PK int(11) name VARCHAR(30) NOT NULL owner_id INDEX int(11) -> FK to users.id 当我制作脚手架时,模型看起来有点像这样: User.cs: public User() {
users
-------------
id PK int(11)
username UNIQUE varchar(20)
rooms
-------------
id PK int(11)
name VARCHAR(30) NOT NULL
owner_id INDEX int(11) -> FK to users.id
当我制作脚手架时,模型看起来有点像这样:
User.cs:
public User()
{
Rooms = new HashSet<Room>();
}
public int Id { get; set; }
public string Username { get; set; }
public virtual ICollection<Room> Rooms { get; set; }
(OwnerId可为空,因为系统机房没有指定的所有者)
问题是,如果我在登录时获得了我的用户对象,并且我查看了user.Rooms
,那么即使数据库有一个条目,集合也总是空的
我知道include修复了这个问题,但这让我不得不从数据库中加载所有房间,这是一个可怕的想法,因为在程序开始时加载了1000多个房间
即使关系设置正确,为什么集合始终为空?设置关系与在内存中加载相关实体不同。 您可以根据需要选择4种不同的加载机制
可以使用“选择加载”筛选必须加载的相关图元。因此,您不需要加载所有相关的实体。为什么您认为它会从数据库表加载每个房间?使用“包含”时,应仅加载与查询的用户记录相关的文件室。您是否在迁移时先编写代码?如果您不首先使用代码,则有可能因为您的模式存在某些问题而使其无法正常工作。@Timothyjannac不,我先使用数据库。我的模式是正确的,因为它可以是AFAIKvar blog=await_context.blog.Select(p=>newblog{blogcoments=p.blogcoments.Where(s=>!s.ishiden)}.FirstOrDefaultAsync(m=>m.blogId==id);我认为它不起作用,因为我在
p
中的Rooms
将是空的。也许我弄错了,但在这里它将blogcoments
(Rooms
我假设)设置为p.blogcoments
(u.Rooms
我假设)。但这样做仍然是空的。而且,这会使结果变为空(关于我使用的第一个或默认值)我不知道您的数据,但这是使用筛选器获取依赖实体数据的唯一方法。
public int Id { get; set; }
public string Name { get; set; }
public int? OwnerId { get; set; }
public virtual User Owner { get; set; }