私は 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;
マージされた最新の結果が得られますが、いいえ。私は混乱しましたが、さらに読んで、問題ないことに気付きましたが、以下のクエリは 2 回目にデータベースに到達しないはずです (Ayende の投稿を理解している限り):
var projectsIds = profile.FavoriteProjects.Select(x => x.Id).ToList();
var projects = session.Load<Project>(projectsIds);
私は正しいですか?ブログで 1 つのエンティティ ( ) についてのスピーチがありましたが、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);
よりリレーショナルになるように再設計しますか?