質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

【C#】【EntityFramework】一度更新がかかった後で外部キーで繋げているテーブルにもAddOrUpdateで更新させる方法について知りたい

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 642

Ryukkef

score 12

環境

・VS2017 (.NetFramework4.6.1)
・C#
・Windows Form
・EntityFramework 6.2
・SQL Serverへのアクセス

分からない事

外部キーで繋げているテーブルにもAddOrUpdateで更新させる方法が分からない。

現状での更新方法と出来ていない事の具体例

テーブルA 1:多 テーブルB 1:多 テーブルC
となっているようなテーブル構造を私は構築しました。
EFでのモデルを超簡略化させるといかのようなイメージです。

public partial class ModelA
{
    public string Hoge { get; set; }
    public virtual ICollection<ModelB> ModelBs { get; set; }
}

public partial class ModelB
{
    public string Fuga { get; set; }
    public virtual ICollection<ModelC> ModelCs { get; set; }
}

public partial class ModelC
{
    public virtual string Fugo { get; set; }
}

今は以下の様に更新をかけています。

var modelA = new ModelA();

foreach(var item in HogeCollection)
{
    var modelB = new ModelB();
    modelB.Fuga = "nn";
    foreach(var item2 in FugaCollection)
    {
        var modelC = new ModelC();
        modelC.Fugo = "abc";
        modelB.ModelCs.Add(modelC);
    }

    modelA.ModelBs.Add(modelB);
}

using (var context = new Context())
{
    context.ModelAs.AddOrUpdate(modelA);
    await context.SaveChangesAsync();
}

この方法だと、
テーブルAに対しては AddOrUpdateが正しくかかりますが、
一度更新した後に、テーブルB, テーブルCの一部だけレコード削除をして
全く同じ内容で再度、AddOrUpdateをした場合にテーブルB, テーブルCに対してAddされません。

どのようにすれば、一度更新がかかった後で外部キーで繋げているテーブルにもAddOrUpdateで更新できるのでしょうか。

ちなみに、ここでいう
ModelA には 7万件、
ModelB には 50万件
ModelC には 500万件のレコードが入っています。

パフォーマンスも考慮された回答であればなお嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • SurferOnWww

    2018/10/17 10:41

    前のスレッド https://teratail.com/questions/151831 の問題は臨時処置的(?)に解決されたようですが、恒久処置(そのようなコードを入れなくても動くようにすること)は取られたのでしょうか? 今回の問題が、前のスレッドの問題を引きずっているのかは分かりませんが・・・

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • C#に関する質問
  • 【C#】【EntityFramework】一度更新がかかった後で外部キーで繋げているテーブルにもAddOrUpdateで更新させる方法について知りたい