と仮定I持ってEntity Frameworkのコードファーストセットアップで、次のモデルクラス:更新切り離さエンティティ
はpublic class Person
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Person> People { get; set; }
}
このコードから作成したデータベースは多くを表すTeamPersonsテーブルを含み、人とチームの多対多の関係。
ここで、Teamsのコレクションに1つ以上の切断されたTeamオブジェクトが含まれている(プロキシではなく、まだコンテキストに接続されていない)Personオブジェクトがあるとします。 IDが1の人とIDが3でチームはすでにDBに存在していれば、ちょうど例えば、以下によって作成されるようなオブジェクト:
var person = new Person
{
Id = 1,
Name = "Bob",
Teams = new HashSet<Team>
{
new Team { Id = 3, Name = "C Team"}
}
};
このオブジェクトを更新する最良の方法は何ですか、更新後、TeamPersonsテーブルにBobの単一の行が含まれ、Cチームにリンクされます。私は明らかにしようとしました:
using (var context = new TestContext())
{
context.Entry(person).State = EntityState.Modified;
context.SaveChanges();
}
しかし、チームコレクションはこれで無視されます。私も様々なことを試しましたが、私がここにいるのはまったく何もしていないようです。助けてくれてありがとう。
EDIT:
だから私はそれらを更新して、変更をコミットし、DBから[s]は、私は人とチームの両方を取得することができることを得る:
using (var context = new TestContext())
{
var dbPerson = context.People.Find(person.Id);
dbPerson.Name = person.Name;
dbPerson.Teams.Clear();
foreach (var id in person.Teams.Select(x => x.Id))
{
var team = context.Teams.Find(id);
dbPerson.Teams.Add(team);
}
context.SaveChanges();
}
これは苦痛ですPersonが複雑なエンティティの場合は、私はAutomapperや何かを少しでも簡単に使うことができると知っていますが、新しい人物を取得してすべてのプロパティをコピーする必要はなく、元の人物オブジェクトを保存する方法がないと残念です。
購入自体を持っている場合、これは動作していないよう知らせませんでした:その人にDBから取り出されたチームを追加しますプロキシではないため、TeamPersonsテーブルは更新されません。仕事はdbからTeamとPersonの両方をフェッチしているので(Personはプロキシですが)、このフェッチされたPersonを更新して、保存されているPersonと一致させる必要があります... – Duncan
読んでいる方が良い)。編集後: 'DbContext.Entry(dbPerson).CurrentValues.SetValues(person)'を使うことができます。 –
ありがとう、それは便利です - 私はCurrentValues.SetValuesについて知りませんでした – Duncan