デタッチされたオブジェクトの操作は非常に難しいです。
いずれにしても、外部キーのプロパティを追加して処理する方法があります(プロパティを追加するだけではありません)。詳細については、他の回答を参照してください。分離したエンティティで作業したい場合は、これが最良の選択だと思います。あなたがn-mの関係(HasMany WithMany)で作業する必要がある場合は、動作しません。
別の解決策は、この(これは、nmの関係でも動作します)
context.Holders.Attach(holder);
context.Entry(holder).State = EntityState.Modified;
var manager = ((IObjectContextAdapter)context).ObjectContext.ObjectStateManager;
manager.ChangeRelationshipState(holder, holder.Thing, "Thing", EntityState.Added);
context.SaveChanges();
は、このソリューションについての問題は、EFはこの
update [Holders]
set [Some] = @p0, [ThingId] = @p1
where (([Id] = @p2) and [ThingId] is null)
@p0 = "Holder updated"
@p1 = 100
@p2 = 200
に似更新クエリを生成していることである(どこを見ています
更新方法をこれに変更すると(読みやすくなります)、同様の現象が発生します。
var thing = holder.Thing;
holder.Thing = null;
var attachedHolder = context.Holders.Attach(holder);
attachedHolder.Thing = thing;
context.Entry(holder).Property("Some").IsModified = true;
context.SaveChanges();
は、この場合にも発生した更新クエリを使用すると、(取り外し可能)、オリジナル事を知っている必要があり、両方の場合で、だから、
update [Holders]
set [Some] = @p0, [ThingId] = @p1
where (([Id] = @p2) and [ThingId] is null)
@p0 = "Holder updated"
@p1 = 100
@p2 = 200
です。あなたはそれを知っている場合は、この方法でコードを変更することができます:私はEFのソースコードのこの部分を読んでいない実際
var thing = holder.Thing;
holder.Thing = myOldThing; // for example new Thing() {Id = 2} works
var attachedHolder = context.Holders.Attach(holder);
attachedHolder.Thing = thing;
context.Entry(holder).Property("Some").IsModified = true;
context.SaveChanges();
が、私は、この動作は、nmの関係を管理することができます関係ハンドラに関連していると思います(HasMany-WithMany)。この場合、EFは関係の「サポート」テーブルも生成し、主キー列は2つの表の主キー列の合計です。この種のリレーションシップを更新するには、サポートテーブルの主キーの場所が必要です。
テーブルのキーは何ですか?あなたはFKを変更するために何をしましたか? – DevilSuichiro
@DevilSuichiroキーは* Id *(整数値の同一性)です。 FKへの変更は、関連するオブジェクトのインスタンスを割り当てることによって行われます(オリジナルのエンティティを**作成するときと同じように**更新**を行います)。 –
あなたは実際にあなたのコンテキストにホルダーをつけているので、変更はその外で行われますか?物事はあなたの文脈の一部ですか?あなたのエントリが正しく保存されているので、私は物事があなたの文脈の一部ではないと思うので、参照整合性チェックは成功します。そのため、EFは何かをしなければならないということを知らず、事物は文脈の一部ではなく、ナビゲーション特性は非EF法によって変化しました(私は信じています)。何かをあなたのコンテキスト(変更なし)に添付してからmodel.ChangeTracker.DetectChanges()を呼び出すとどうなりますか? – DevilSuichiro