2011-01-10 3 views
2

2 엔티티 사이에 많은 관계가 있습니다. UserInfo 및 캠페인 및 세 번째 테이블 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); 
} 

내 질문은 I를 어떻게 사용자가 기존 캠페인을 보유하고 있거나 갖지 않았 음을 고려한 최신 UserInfo 캠페인?

기존 UserInfoCampaign을 모두 삭제 한 다음 새 UserInfoCampaign으로 다시 할당합니까? 또는 LINQ to SQL을 사용하여 먼저 UserInfo 캠페인을 삭제하지 않고 UserInfo 캠페인을 업데이트하는 더 효과적인 방법이 있습니까?

고마워요.

답변

1

일반적으로 삭제 한 다음 다시 만드십시오. 그것이 내가 이와 같은 많은 상황을 처리하는 방법입니다.

+0

이것은 가장 쉬운 방법입니다. 그것은 제거 된 레코드에 대한 삭제를 커밋하는 문제를 해결합니다. 그렇지 않으면 몇 개의 사용자가있는 캠페인을 유지하지만 이전에 삭제해야하는 사용자는 무기한으로 유지됩니다. –

0

(전체 삭제) 솔루션을 선택한 경우 테이블에 ID가 증가하지 않는다고 생각할 수 있습니다 (PK가 int라고 가정하고 있음). 그런 다음 삭제하지 마십시오. 그런 다음 사용자가 캠페인을 삭제 된 것으로 간주하는 캠페인 표에서 플래그 (IsDeleted)를 설정할 수있는 ID를 계속 형식으로 유지하려면 사용자가 캠페인을 삭제할 때 확인하도록 설정하십시오. 사용자가 UI에서 그것을 다시 선택할 때 false로 설정하면 레코드가 적게 확보되지만 코드에서 더 많은 작업이 수행됩니다.

+1

왜 당신은 지속적인 PK에 대해 걱정할 것입니까? –

0

일반적으로 SQL에서 처리하도록합니다. SQL의 관계에 ON DELETE을 지정할 수 있습니다. 원하는 동작에 따라 CASCADE 또는 SET DEFAULT 또는 SET NULL을 사용할 수 있습니다.

여기 ON DELETE CASCADE에 대한 예입니다 : http://www.codeproject.com/KB/cs/CascadingDeletes_cs.aspx