2011-01-10 15 views
2

私は2つのエンティティ間に多対多の関係を持っています。 UserInfoとCampaignと3番目の表UserInfoCampaignsLinq to SQL ManyToMany既存のレコードを更新する

フロントエンドでは、複数のチェックボックスを使用してユーザーキャンペーンを更新できるはずです。

だから私は持っている:

var selectedCampaignsIds = new int[] {1,2,3}

var user = _extendedUserService.GetUser(new Guid(userId));

var newCampaigns =_campaignrepository.GetAllCampaignsByIds(selectedCampaignsIds);

私は以下のことで、新たに選択したキャンペーンを割り当てることができます。

foreach (var campaign in newCampaigns) 
{ 
    var userInfoCampaign = new UserInfoCampaign { UserInfoId = user.Id, CampaignId = campaign.Id }; 
    _campaignrepository.SaveUserInfoCampaign(userInfoCampaign); 
} 

私の質問は私が行う方法ですユーザーに既存のキャンペーンがあるかどうかを考慮した最新のUserInfoキャンペーン

既存のUserInfoCampaignをすべて削除してから、新しいUserInfoCampaignを再割り当てしますか?または、LINQ to SQLを使用してUserInfoキャンペーンを最初に削除せずにUserInfoキャンペーンを更新するより最適な方法がありますか?

ありがとうございます。

答えて

1

通常、削除してから再作成します。それが、私がこのような多かれ少なかれの状況を処理する方法です。

+0

これが最も簡単な方法です。削除されたレコードの削除をコミットするという問題を解決します。それ以外の場合は、いくつかのユーザーインシデントを持つキャンペーンを保持しますが、削除する必要のある古いユーザーインシデントは無期限に残ります。 –

0

(すべて削除する)ソリューションに行った場合、そのIDが気にする必要がない場合は、テーブルにIDが増えていないと思うかもしれません(あなたのPKがintであると仮定しています)それらを再追加します。

アイデンティティを継続フォームにする場合は、キャンペーンを削除済みとして参照するフラグ(IsDeleted)を設定することができます。ユーザーがキャンペーンを削除するとユーザーがUIからそれを再選択するとfalseに設定されます。これにより、レコードが少なくて済むようになりますが、コード内でよりうまく作業することができます。

+1

なぜ継続的なPKが心配ですか? –

0

一般に、SQLに処理させます。 SQLの関係にON DELETEを指定することができます。具体的な動作に応じて、CASCADEまたはSET DEFAULTまたは​​とすることができます。

ここON DELETE CASCADEのための例です: http://www.codeproject.com/KB/cs/CascadingDeletes_cs.aspx

関連する問題