2

編集: スタブ エンティティの定義

サブスクライバーアドオンの 2 つのエンティティ タイプがあります。

データモデルでの定義は次のとおりです

サブスクライバー( #SubscriberID ,Name,AddOnID)

AddOn( #AddOnID ,名前)

Subscriber テーブルの AddOnID 列は、AddOn テーブルの AddOnID 列を参照します。


特定の Subscriber エンティティの AddOn 参照を更新しようとしています。たとえば、Subscriber#1 の AddOn 参照を AddOn#5 に変更したいとします。コードは次のとおりです。

    Subscriber subscriber = new Subscriber { SubscriberID = 1};
    AddOn newAddOn = new AddOn { AddOnID = 5};

    using (var context = new TestEntities())
    {
        context.AttachTo("AddOn", newAddOn);
        context.AttachTo("Subscriber", subscriber);

        subscriber.Name = "dummy";
        subscriber.AddOn = newAddOn;

        context.SaveChanges();
    }

これにより、「 context.SaveChanges();」行で例外がスローされます。

AssociationSet 'FK-Subscriber-AddOn' から関係を追加または削除しています。カーディナリティの制約により、対応する「サブスクライバー」も追加または削除する必要があります。

subscriber.AddOn = newAddOn;」行をコメントアウトすると、更新操作は正常に機能します。

では、非参照プロパティを更新するのと同じように参照プロパティを更新できないのはなぜですか?


注: それが正しい方法かどうかはわかりませんが、「context.Refresh(RefreshMode.StoreWins,subscriber); " OR " context.Refresh(RefreshMode.ClietWins,subscriber); " を attach ステートメントの後に追加すると機能します。

この動作はなぜですか?

4

2 に答える 2

3

EF 3.5 SP1では、元の値を知らずに参照(つまり、subscriber.Addon)を変更することはできません。FKアソシエーションを使用する場合、この制限はEF4でなくなることに注意してください。

現在、ほとんどの場合、EFはこの余分な複雑さを隠しますが、このようにAttachを使用している場合は隠しません。

必要なコードは次のとおりです。

AddOn newAddOn = new AddOn { AddOnID = 5};
AddOn oldAddOn = new AddOn { AddOnID = 4}; // you need to remember the old id.
Subscriber subscriber = new Subscriber { SubscriberID = 1, AddOn = oldAddOn};

using (var context = new TestEntities())
{
    context.AttachTo("AddOn", newAddOn);
    context.AttachTo("Subscriber", subscriber); // will attach the oldAddOn too

    subscriber.Name = "dummy";
    subscriber.AddOn = newAddOn;

    context.SaveChanges();
}

ご覧のとおり、EFに元の関係を伝えてから、以前と同じように変更しています。

それはあなたの問題を解決するはずです。

リフレッシュの呼び出しも機能することを発見したので...データベースから参照の元の値を取得するためです。更新を使用することの欠点は、データベースにクエリを発行することです。

したがって、上記のように元の値を添付すると、余分なクエリが節約されます。

お役に立てれば

-アレックス

プログラムマネージャーエンティティフレームワークチーム。

詳細については、EFヒントシリーズのヒント26を参照してください。

于 2009-10-03T00:45:21.147 に答える
0

子エンティティを別のエンティティに追加する方法を尋ねていると思います。したがって、あなたの場合、親エンティティ: Subscriber と子エンティティ: AddOn があります。これが当てはまり、データ モデルに正しい関係が設定されている場合は、次のようなコードが必要になるでしょう。

Subscriber subscriber = new Subscriber { SubscriberID = 1};
AddOn newAddOn = new AddOn { AddOnID = 5};

using (var context = new TestEntities())
{

    context.AttachTo("Subscriber", subscriber);
    subscriber.Addon.Add(newAddOn);

    subscriber.Name = "dummy";

    context.SaveChanges();
}
于 2009-10-02T21:58:15.437 に答える