2

これが状況です。私には3つのエンティティがあり、そのうち次の関係があります。

-Team one-to-one TeamContact
-TeamContact one-to-one TeamAddress

これらのオブジェクトを問題なく作成、追加、保存することができました。ただし、編集メソッドを作成しようとすると、変更後に親オブジェクトのみが保存されます。私がこれまでに持っているものを以下に見てください。

Dbクラスにメソッドを保存します

public void SaveTeam(Team team)
    {
        if (team.Id == 0)
        {
            context.Teams.Add(team);
        }
        else
        {
            var model = context.Teams.Find(team.Id);
            context.Entry(model).CurrentValues.SetValues(team);
        }
        context.SaveChanges();
    }

編集方法

[HttpGet]
    public ActionResult Edit(int id)
    {
        var model = _dataSource.Teams.FirstOrDefault(t => t.Id == id);
        return View(model);
    }

    [HttpPost]
    public ActionResult Edit(Team team)
    {
        if (ModelState.IsValid)
        {
            _dataSource.SaveTeam(team);

            return RedirectToAction("Detail", "Team", new { id = team.Id });
        }
        return View(team);
    }

上で言ったように、私が持っているのは親オブジェクトを変更することしかできませんが、ここで何を見逃しましたか?

試してみました

 public void SaveTeam(Team team)
    {
        if (team.Id == 0)
        {
            context.Teams.Add(team);
        }
        else
        {
            //var model = context.Teams.Find(team.Id);
            var model = context.Teams.Include(c => c.TeamContact).Single(t => t.Id == team.Id);
            context.Entry(model).CurrentValues.SetValues(team);
            model.TeamContact = team.TeamContact;
        }
        context.SaveChanges();
    }

上記を試した後、このエラーが発生しました:

Violation of PRIMARY KEY constraint 'PK_dbo.TeamAddresses'. Cannot insert duplicate key     in object 'dbo.TeamAddresses'. The duplicate key value is (5).
 The statement has been terminated.

結論として、Nレベルのディープオブジェクトをどのように更新しますか?

4

2 に答える 2

5

長い検索と読み取りの後、私は最終的に自分が何をしようとしているのかを理解しました. N レベルの深いオブジェクト グラフを作成して保存することは、それらのオブジェクトを更新することほど難しくありませんでした。とにかく、Danny Varod のコメントを読んだ後、戻ってDbContextの詳細を読むことにしました。以下は私がやろうとしていたことです。また、新しいオブジェクトを保存するために同じ方法を使用していることをお詫びします。

public void SaveTeam(Team team)
    {
        if (team.Id == 0)
        {
            context.Teams.Add(team);
        }
        else if (team.Id > 0)
        {
            //This Updates N-Level deep Object grapgh
            var currentTeam = context.Teams
                .Include(c => c.TeamContact)
                .Include(a => a.TeamContact.TeamAddress)
                .Single(t => t.Id == team.Id);

            context.Entry(currentTeam).CurrentValues.SetValues(team);
            currentTeam.TeamContact.TeamAddress = team.TeamContact.TeamAddress;
            currentTeam.TeamContact = team.TeamContact;
        }
        context.SaveChanges();
    }
于 2012-12-09T06:23:00.950 に答える
2

提供されたエンティティから到達可能なグラフ全体をアタッチする add とは異なり、apply changes は提供されたエンティティにのみ変更を適用し、どの接続されたエンティティも変更する必要があるかはわかりません。

エンティティごとに変更の適用を呼び出す必要があります。

于 2012-12-06T09:11:42.743 に答える