문제
나는 SQL에서 너무 오랫동안 작업하지 않았지만 트랜잭션 내에 SQL 문을 감싸서 모든 진술이 완료되었거나 그 중 어느 것도하지 않았다는 것을 이해했다고 생각했습니다. 여기 내 문제가 있습니다. LineItem 컬렉션이있는 주문 객체가 있습니다. 라인 항목은 Order.OrderId와 관련이 있습니다. 나는 그것을 확인했다 모든 ID가 설정되어 있으며 정확합니다 하지만 내가받는 순서를 저장 (삽입)하려고 할 때 삽입 명령문은 외래 키 제약 조건 "FK_OrderItemDetail_order"와 충돌했습니다. 충돌은 데이터베이스 "myData", 테이블 "dbo.order", column 'OrderId'에서 발생했습니다.
psuedo 코드 :
create a transaction transaction.Begin() Insert order Insert order.LineItems <-- error occurs here transaction.Commit
실제 코드 :
... entity.Validate(); if (entity.IsValid) { SetChangedProperties(entity); entity.Install.NagsInstallHours = entity.TotalNagsHours; foreach (OrderItemDetail orderItemDetail in entity.OrderItemDetailCollection) { SetChangedOrderItemDetailProperties(orderItemDetail); } ValidateRequiredProperties(entity); TransactionManager transactionManager = DataRepository.Provider.CreateTransaction(); EntityState originalEntityState = entity.EntityState; try { entity.OrderVehicle.OrderId = entity.OrderId; entity.Install.OrderId = entity.OrderId; transactionManager.BeginTransaction(); SaveInsuranceInformation(transactionManager, entity); DataRepository.OrderProvider.Save(transactionManager, entity); DataRepository.OrderItemDetailProvider.Save(transactionManager, entity.OrderItemDetailCollection); if (!entity.OrderVehicle.IsEmpty) { DataRepository.OrderVehicleProvider.Save(transactionManager, entity.OrderVehicle); } transactionManager.Commit(); } catch { if (transactionManager.IsOpen) { transactionManager.Rollback(); } entity.EntityState = originalEntityState; } } ...
누군가는 주문을 위해 두 개의 트랜잭션을 사용해야한다고 제안했지만 하나는 라인 항목에 대해 하나를 사용해야한다고 제안했지만 합리적으로 그것이 잘못되었다고 확신합니다. 그러나 나는 지금 이것을 하루 종일 싸우고 있었고, 그 일을 해결할 수 있도록 해결해야합니다. 난 그냥 바보 같은 일을하고 있을까요?
해결책
코드 생성에 Nettiers를 사용하고 있다고 말했습니다.
Nettiers를 직접 사용했는데 테이블에서 외국 키 제약 조건을 삭제하면 동일한 테이블에 다시 추가 한 다음 데이터베이스를 변경하면 데이터 액세스를 재설정하는 데 도움이 될 수 있습니다. 층. 나는 긍정적 인 결과로 때때로 이것을 시도했습니다.
당신의 문제에 행운을 빕니다.
다른 팁
코드를 보지 않으면 문제가 무엇인지 말하기가 어렵습니다. 그것은 여러 가지 일 수 있지만 이것을보십시오.
- 이것은 분명하지만, 두 개의 삽입 명령이 트랜잭션을 소유 한 동일한 연결 (연결이 계속 열려 있음)에 있습니다.
- 첫 번째 삽입 후 제약 조건과 관련된 ID를 검색하고 명령을 실행하기 전에 두 번째 삽입 데이터에 다시 작성하고 있습니까?
- 제약 조건은 DB에서 잘못 설정 될 수 있습니다.
당신은 확실히 두 가지 거래를 사용하고 싶지 않습니다.
LineItems에 대한 삽입 명령문이 올바르게 순서 값을 설정하지 않은 것 같습니다. 이것은 결과입니다. Insert order
단계. 개별 SQL 문을 보았고 테스트 했습니까?
나는 당신의 문제가 트랜잭션 제어와 관련이 있다고 생각하지 않습니다.
이것에 대한 경험은 없지만 부모 테이블에서 사용할 수없는 키 값을 지정한 것 같습니다. 죄송하지만 이보다 더 많은 도와 줄 수는 없습니다.
문제는 오류를 처리하는 방법입니다. 오류가 발생하면 트랜잭션이 자동으로 롤백되지 않습니다. 당신은 확실히 (그리고 아마도) 그것을 선택할 수 있지만, 앱이나 당신이 어디에 있는지에 따라 여전히 그것을 커밋하고 싶을 수도 있습니다. 그리고이 경우, 그것이 당신이하는 일입니다. 오류가 발생할 때 코드를 롤백하려면 오류 처리 코드를 래핑해야합니다.
오류는 라인 템이 적절하지 않은 것 같습니다. FK Orderid 주문 테이블에 순서의 삽입물에 의해 자율적으로 생성되었습니다. 당신은 당신이 ID를 확인했다고 말하고, 주문 세부 정보에서도 FKS를 확인 했습니까?