オプションの親ノード フィールドを持つ Entity Framework Code First を使用して定義されたエンティティがあります。null 親ノード値は、エンティティのノードがルートにあることを意味します。同じ親の下に複数の子が存在します。
Class ContentDescriptor
{
virtual ObjectId ParentObjectId{get;set;}
}
DB イニシャライザで:
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithOptionalDependent()
.Map(m => m.MapKey("ParentObjectId"));
ナビゲーション プロパティは次のように割り当てられます。
DBContext.ContentDescriptors.Add(contentDescriptor);
contentDescriptor.ParentObjectId = ObjectIdFactory.Save(parent);
ObjectIdFactory.Save は、DBContext.ObjectId.Local にエントリがあるかどうかをチェックし、次に DBContext.ObjectId をチェックします。メモリまたは DB にレコードがない場合は、挿入を実行して結果を返します。
ただし、新しいノードがコンテキストに追加されると、親の最初の子のみが正しく保存されます。2 番目以降の子は、ローカルで親の子として表示される場合でも、ルートに追加されます。エンティティが追加されているときに、フレームワークが外部キーの更新クエリを生成できないようです。
私の回避策は、エンティティで外部キーを公開し、外部キーを手動で割り当てることですが、より洗練された解決策があるかどうか疑問に思っています。
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithMany().
HasForeignKey(c=>c.ParentObjectIdRaw);
Property(c => c.ParentObjectIdRaw).HasColumnName("ParentObjectId");
contentDescriptor.ParentObjectIdRaw = contentDescriptor.ParentObjectId.ObjectIdId;