エンティティフレームワークコードファーストを使用してエンティティを定義しましたが、オプションの親ノードフィールドがあります。ヌルの親ノード値は、エンティティのノードがルートにあることを意味します。同じ親の下に複数の子供がいます。 DB初期化子で外部キーの変更は、最初にEF4コードには影響しません
Class ContentDescriptor
{
virtual ObjectId ParentObjectId{get;set;}
}
は:
DBContext.ContentDescriptors.Add(contentDescriptor);
contentDescriptor.ParentObjectId = ObjectIdFactory.Save(parent);
ObjectIdFactory.SaveチェックをDBContext.ObjectId.Localにエントリがある場合、その後:
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithOptionalDependent()
.Map(m => m.MapKey("ParentObjectId"));
ナビゲーションプロパティは、以下のように割り当てられていますDBContext.ObjectId、メモリまたはDBにレコードがない場合は、挿入して結果を返します。
ただし、新しいノードがコンテキストに追加されると、親の最初の子だけが正しく保存されます。 2番目以降の子は、ローカルの親の子として表示されても、ルートに追加されます。エンティティが追加されているときに、フレームワークが外部キーの更新クエリを生成できないように見えます。
私walkaroundは、エンティティ内の外部キーを公開し、手動で外部キーを割り当てることですが、よりエレガントな解決策がある場合、私は疑問に思って:
HasOptional(contentDescriptor => contentDescriptor.ParentObjectId).WithMany().
HasForeignKey(c=>c.ParentObjectIdRaw);
Property(c => c.ParentObjectIdRaw).HasColumnName("ParentObjectId");
contentDescriptor.ParentObjectIdRaw = contentDescriptor.ParentObjectId.ObjectIdId;
を助け
SaveChanges()
希望に前だけで子供を救う基本的に他のすべてのエンティティがのObjectIdを持っていると私は不要導入したくないたObjectIdに関連するクエリに参加し、その親オブジェクトIDには、コレクションプロパティがありません。私はWithManyを試してナビゲーションプロパティを設定しましたが効果はありません。 –
コレクションプロパティで何も追加されていない場合、追加のナビゲーションプロパティが追加されます(既存のリレーションシップの他の部分)。とにかく、 '.WithMany()'を使用してコレクションを削除しても、何も変更されません。そして、私の側では、すべてのノードが正しく追加されます。そのメソッドの内部で何もしていないことを確認してください。 – NSGaga
私のエンティティの関係は少し異なります。いくつかのオブジェクトタイプのみがツリー構造であり、他のオブジェクトはフラットリストまたは他の構造を有することができる。ツリー構造のオブジェクトタイプは、ContentDescriptorテーブルに保存された関係を持ちます。そして、パートナーからの私のすべてのルックアップはObjectIdに基づいているため、ParentObjectIdはキャッシュ列から親子関係を定義する唯一の列に移動しました。 ObjectId.ParentObjectId列を追加すると多くの記憶領域が浪費され、ContentDescriptor.ParentContentDescriptorは検索に非効率的になります。 –