0

自己参照を持つエンティティがあります (エンティティ デザイナーによって生成されます):

public MyEntity: EntityObject
{
    // only relevant stuff here
    public int Id { get...; set...; }
    public MyEntity Parent { get...; set...; }
    public EntityCollection<MyEntity> Children { get...; set...; }
    ...
}

テーブルからノードのサブツリー (直接の子だけでなくMyEntity) を返し、オブジェクトのリストを返すストアド プロシージャを作成しました。ストアド プロシージャを使用して、任意の深いツリーの遅延読み込みを回避しています。このようにして、関連するサブツリー ノードを 1 回の呼び出しで DB から取得します。

List<MyEntity> nodes = context.GetSubtree(rootId).ToList();

大丈夫だ。しかし、 をチェックするnodes[0].Childrenと、Count0 に等しくなります。しかし、デバッグして をチェックするcontext.MyEntities.Results viewと、Children 列挙が入力されます。私の結果を確認すると、私のnode[0].

Parentエンティティ コンテキストにインメモリ マジックを実行させ、プロパティとプロパティに正しい参照を配置するようにプログラムで強制するにはどうすればよいChildrenですか?

更新 1

電話してみた

context.Refresh(ClientWins, nodes);

GetSubtree()リレーションを適切に設定する私の呼び出しの後、 DBから同じノードを再度フェッチします。それはまだ単なる回避策です。しかし、 でセット全体を取得するよりはましcontext.MyEntities().ToList()です。

更新 2

EF Extensions プロジェクトを使用して、これを確実に解決しました。以下の私の答えを確認してください。

4

2 に答える 2

0

REALソリューション

この記事( 「問題」のテキストを読む)に基づくと、ストアドプロシージャを使用してデータを返す場合、ナビゲーションプロパティは明らかに入力/更新されません。

しかし、これには優れた手動ソリューションがあります。EF Extensionsプロジェクトを使用して、次のMaterilizer<EntityType>ようなナビゲーションプロパティを正しく設定できる独自のエンティティを作成します。

...
ParentReference = {
    EntityKey = new EntityKey(
        "EntityContextName.ParentEntitySetname",
        new[] {
            new EntityKeyMember(
                "ParentEntityIdPropertyName",
                reader.Field<int>("FKNameFromSP")
            )
        })
}
...

以上です。ストアドプロシージャを呼び出すと正しいデータが返され、エンティティオブジェクトインスタンスは相互に正しく関連付けられます。EF Extensionsのサンプルをチェックすることをお勧めします。ここには、たくさんの素晴らしいものがあります。

于 2009-12-14T11:44:33.647 に答える
0

関係の一端を割り当てる必要があります。まず、コレクションを分割します。

var root = nodes.Where(n => n.Id == rootId).First();
var children = nodes.Where(n => n.Id != rootId);

さぁ、関係を修復しましょう。

あなたの場合、次のいずれかを行います。

foreach (var c in children)
{
    c.Parent = root;
}

...また:

foreach (var c in children)
{
    root.Children.Add(c);
}

どちらでも構いません。

これにより、エンティティが変更済みとしてマークされることに注意してください。SaveChangesコンテキストを呼び出すつもりで、これを保存したくない場合は、これを変更する必要があります。

于 2009-12-11T14:10:38.990 に答える