문제

프로젝트에서 저는 데이터베이스에서 "사용자"를 삭제해야합니다.이 "사용자"에는 외래 키를 참조하는 두 개의 테이블이 있습니다.하드 삭제할 때 "사용자"에 외부 키가있는 테이블 A와 표 B에서 모든 레코드를 삭제하고 "사용자"레코드를 삭제합니다.이것은 모두 저장소 내에서 수행되고 개체 공장을 사용합니다.

코드는 다음과 같습니다.

public void RemoveUserByUserId(int userId)
{
var user = m_context.User.GetByKey(userId);

ObjectFactory.Inject(m_context);

UserTokenRepository.RemoveUserTokensByUserId(userId);
UserMappingRepository.RemoveUserMappingsByUserId(userId);

m_context.User.DeleteOnSubmit(user);

m_context.SubmitChanges();

ObjectFactory.ResetDefaults();
}

public static void RemoveUserTokensByUserId(int userId)
{
var dataContext = ObjectFactory.GetInstance<DataContext>();
var userTokens = dataContext.UserToken.ByUserId(userId);
dataContext.UserToken.DeleteAllOnSubmit(userTokens.AsEnumerable());
}

public static void RemoveUserMappingsByUserId(int userId)
{
var dataContext = ObjectFactory.GetInstance<DataContext>();
var userMappings= dataContext.UserMapping.ByUserId(userId);
dataContext.UserMapping.DeleteAllOnSubmit(userMappings.AsEnumerable());
}
.

각 테이블에 하나의 레코드가있는 경우 잘 작동합니다.테이블에 usercoenken 및 usermappings에서만 발생할 수있는 테이블이있는 경우 다음 오류가 발생합니다.

System.ArgumentException was unhandled by user code
Message=An item with the same key has already been added.
  Source=mscorlib
  StackTrace:
       at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
       at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
       at System.Data.Linq.ChangeProcessor.EdgeMap.Add(MetaAssociation assoc, TrackedObject from, TrackedObject to)
       at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
       at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
       at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
       at XXXX.XXXX.XXXX.XXXXDataContext.SubmitChanges(ConflictMode failureMode) in XXXX:line 519
       at System.Data.Linq.DataContext.SubmitChanges()
       at XXXX.UserRepository.RemoveUserByUserId(Int32 userId) in XXXX:line 146
       at XXXX(Int32 profileUserId) in XXXX:line 948
       at XXXX(Int32 profileUserId) in XXXX:line 165
       at SyncInvokeUnregisterUserForActivationFailed(Object , Object[] , Object[] )
       at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
       at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
.

개인 정보 보호의 이유로 XXXX를 넣어야했습니다.LINQ는이를 읽는 것과 같이 SQL에 대한 변경 사항을 준비하고있는 것과 같아서 사전에 넣어 두 가지가 있으며 변경이 발생하기 전에 두 가지가 동일하고 오류가 발생합니다.

도움이 많이 감사 할 것입니다.

도움이 되었습니까?

해결책 2

이것은 오래된 질문이지만이 삭제를 두 테이블 모두 동시에 결코 만들 수 없었습니다.우리의 해결책은 다른 하나를 삭제하고 변경 사항을 커밋하는 것이 었습니다.

다른 팁

나는 여기에서 어둠 속에서 촬영하고 당신이 읽는 방법을 가정하고있는 것으로 가정하고있는 것이 내가 그 길을 따라가는 약간의 고통과 함께 정확합니다.

삭제할 테이블은 자신의 기본 키가 있거나 외래 키를 PK로 사용하고 있습니까? (잘 당신은 내가 의미하는 바를 알고 있습니다 ... LINQ가 알고있는 자신의 독립적 인 독특한 기본 키가있는 것처럼 들리지 않습니다.) '

LINQ는 GetHash 메소드를 사용하여 기본 키 필드에서 고유 한 ID를 생성합니다.이 필드가 복제되고 사전 문제점이 있음을 추측하고 있습니다 ... 문제는 동일한 키 ID를 갖는 2 개의 다른 테이블로 인해 발생하지 않습니다.

여러 항목의 여러 항목을 가진이 테이블이 여러 가지 가입 중간에 일종의 일종이라고 생각합니다. 빠르고 더러운 수정 프로그램은 자동 증분 열을 기본 키에 할당하는 것입니다 (그렇지 않으면 멀티 필드 PK를 사용하는 멀티 필드 PK를 사용해보십시오. - Linq Deliberatley로 실제로 시도한 것입니다.

나는 이것이 몇 가지 아이디어를 제공하기를 바랍니다 ... 부분 클래스에서 GetHashCode를 무시할 수 있습니다. 문제를 해결하려면 ... 그러나 단일 항목에 불변 한 데이터 부분 만 포함해야합니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top