我在 RavenDB 中保留了这样的实体:
public class Project: RootAggregate
{
public string Name { get; set; }
}
public class Profile: RootAggregate
{
public string User { get; set; }
public IList<Project> FavoriteProjects { get; set; }
}
因为,它是文档数据库,而不是关系数据库,所以它是非规范化的,应该没问题。无论如何,我没有这样设计:
public class Profile: RootAggregate
{
public string User { get; set; }
public IList<string> FavoriteProjectsIds { get; set; }
}
但有时我必须加载最新的项目(对于这种情况,使用最新的名称)。我在Ayende 博客上读过可以使用Include()
,如下所示:
var profile = session.Include<Project>(x => x.Id)
.Load<Profile>(Id);
首先我认为声明:
var projects = profile.FavouriteProjects;
会给我合并的最新结果,但没有。我很困惑,但后来我进一步阅读,意识到没关系,但下面的查询应该不会第二次到达数据库(据我了解 Ayende 的帖子):
var projectsIds = profile.FavoriteProjects.Select(x => x.Id).ToList();
var projects = session.Load<Project>(projectsIds);
我对吗?我问是因为在博客中有关于单个实体(Customer
)的演讲,而我想检索整个最新的集合(IList<Project>
)。
接下来,如果在获取与配置文件相关联的新项目时,我想同时搜索索引配置文件(因为我没有他们的 ID),例如如下所示(不允许这样的构造):
var profile = session.Include<Project>(x => x.Id)
.Query<Profile>()
.Single(x => x.User == "jwa");
可以通过某种方式完成,还是需要我“自己”检索最新的项目,如下所示?
var profile = session.Query<Profile>().Single(x = x.User == "jwa");
var projectsIds = profile.FavoriteProjects.Select(x => x.Id).ToList();
var projects = session.Load<Project>(projectsIds);
是否应该重新设计以更具关联性?