2016-11-02 3 views
2

私は1から0または1の関係を表す次のようなモデルを持っています。1から0または1のエンドポイントの置き換え関係

public class Parent 
{ 
    public int ParentId { get; set; } 
    public Child Child { get; set; } 
} 

public class Child 
{ 
    [Key, ForeignKey("Parent")] 
    public int ChildId { get; set; } 

    public Parent Parent { get; set; } 
} 

私はParentの子メンバーを置き換える必要があります。新しいインスタンスが外部ソースから受信されています。

はしかし、子供を交換し、データベースに保存しようとした後:プロパティ 値(複数可):

parent.Child = <new instance> 
context.Entry(parent).State = EntityState.Modified; 

私は、参照整合性制約違反が発生しました」エラーに

を受け取りますリレーションシップの一方の端にある 'Parent.ParentId'の「 」は、もう一方の端の「Child.ChildId」のプロパティ値と一致しません。

エンドポイントをどのように置き換えることができますか?どうすれば削除できますか?ありがとう

+0

私はあなたがそのようなインスタンスを置き換えることができます疑う、私はSQLに削除して、文を挿入することを変換EFを想像することはできません、プロパティを更新する必要があります。 – pjobs

+0

子を置き換える代わりに、新しい子に合わせてプロパティを変更することもできます。最終結果はまったく同じですが、それほど複雑ではありません。 –

+0

@GertArnoldそれはうまくいくが、私は2つの理由でそれを好きではない。 1)すべての特性をコピーするためのボイラープレートコードの必要性。開発者は、新しいプロパティを追加するときにこのアップデートを忘れる可能性があります。 2)モデルのユーザーに使用パターンを強制し、ある意味ではデータベースの周りにある抽象レイヤーを突破します。 – denver

答えて

1

また、あなたは「子供の葛藤」があると思います.1対1の関係があるので、唯一の子供は親に沿うことができます。 newChildを割り当てると、と同じPK(親にFK)の別の(古い)子がすでに存在するため、EFはその子を保存できません。代わりに、あなたは現在の子を削除してから新しい子を割り当てる必要があります。

context.Children.Remove(parent.Child); 
context.SaveChanges(); 
parent.Child = newChild; 
+0

私は分離して作業しているので少し編集しなければなりませんでしたが、最初のテストでは以下のように見えるようになりました:context.Entry(parent.Child).State = EntityState.Deleted; parent.Child = newChild; context.Entry(親).State = EntityState.Modified; context.SaveChanges(); 私はいくつかの追加のテストを行い、レポートを返します。 – denver

関連する問題