2016-06-17 27 views
1

私は最終的にEFコードの自己参照型多対多リレーションシップの周りに頭を抱いていましたが、今では、これらの関係を更新する。 Contact.csクラスで次のようにEFコードファースト自己参照多対多更新リファレンス

modelBuilder.Entity<Contact>() 
        .HasMany(c => c.Friends) 
        .WithMany() 

のは、我々はこのような関係を持っているとしましょう、私の連絡先ビューで

public virtual iCollection<Contact> Friends {get;set;}; 

、私は連絡先のために友達を選択する複数選択を持っています。次に、選択したすべてのものを反復して保存し、thisContact.Friends.Add(friend)を実行して変更を保存します。

その後、連絡先ビューに戻ると、.Friendsを取得して複数選択を再投入するのは簡単ですが、新しい友だちを再保存する際に問題が発生しています。それについて最善の方法は何ですか?私は最初にすべての友達を削除してから、マルチセレクションから新しいものを追加することを考えましたが、それは効率的ではないようで、Contactを保存することに関して、どの時点で.Friendsを削除するのか正確にはわかりませんでした。

マルチセレクションから選択した新しい項目を調べ、既にthisContact.Friendsにあるものと比較して新しいものを追加し、新しいものを追加し、そこにないものを削除して一致するアイテムを保持しますか?

これが意味をなされることを願っております、あらかじめありがとうございます!

+0

友人を置き換えるだけではるかに簡単な方法です。非常に小さいレコードしか含まれていないので、(何百ものアイテムがない限り)高価ではありません。 –

+0

あなたは存在する友人を削除し、新しい友達を追加することを意味しますか? – blubberbo

+0

はい。ジャンクション・テーブル内のレコードのみが削除され、再挿入されます。連絡先は削除されません。 –

答えて

1

ドメインコレクション(contact.Friends)とあなたの友人コレクションがUI(uiFriends)から返されたとしましょう。

まずあなたは方法が唯一の良い「を除き、」削除されました友人(擬似コード)

var removeTheseFriends = contact.Friends.Except(uiFriends); // Returns friends that are only in your domain collection 
var addTheseFriends = uiFriends.Except(contact.Friends); // Returns friends only in your UI collection 

は、あなたが完全なオブジェクトを渡す場合見つけます。 https://msdn.microsoft.com/en-us/library/bb300779(v=vs.90).aspx

実際には、UIコレクションはおそらくFriendsコレクション内の連絡先のIDのリストです。この場合、次のようなことをしてください:

var removeTheseFriends = contact.Friends.Where(i => !uiFriends.Contains(i.Id)); 

// First load the list of friends that correspond to your ui collection Ids 
var domainObjectsOfUiFriendsCollection = context.Contacts.Where(i => uiFriends.Contains(i.Id)); 

// These are now domain objects, so you can now use the Except functionality 
var addTheseFriends = domainObjectsOfUiFriendsCollection.Except(contact.Friends); 

次にリストを繰り返して、必要に応じて追加/削除してください。

+0

私はそれがシステムに負担をかけすぎるとは思わないので、削除してからもう一度追加すると思います。 – blubberbo

+0

上記で、削除する必要があるものを削除して新しいものを追加してください。変更しない連絡先には何もする必要はありません。 – user1455010

+0

申し訳ありませんが、あなたの最後の文章が「あなたのリストを繰り返して、適切なものを追加/削除する」ということを正確にはわかりません。あなたが作成した変数が表示されます。あなたはおそらく私のためにそれを書き留めてもらえますか? – blubberbo

関連する問題