문제

나는 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를 직접 사용했는데 테이블에서 외국 키 제약 조건을 삭제하면 동일한 테이블에 다시 추가 한 다음 데이터베이스를 변경하면 데이터 액세스를 재설정하는 데 도움이 될 수 있습니다. 층. 나는 긍정적 인 결과로 때때로 이것을 시도했습니다.

당신의 문제에 행운을 빕니다.

다른 팁

코드를 보지 않으면 문제가 무엇인지 말하기가 어렵습니다. 그것은 여러 가지 일 수 있지만 이것을보십시오.

  1. 이것은 분명하지만, 두 개의 삽입 명령이 트랜잭션을 소유 한 동일한 연결 (연결이 계속 열려 있음)에 있습니다.
  2. 첫 번째 삽입 후 제약 조건과 관련된 ID를 검색하고 명령을 실행하기 전에 두 번째 삽입 데이터에 다시 작성하고 있습니까?
  3. 제약 조건은 DB에서 잘못 설정 될 수 있습니다.

당신은 확실히 두 가지 거래를 사용하고 싶지 않습니다.

LineItems에 대한 삽입 명령문이 올바르게 순서 값을 설정하지 않은 것 같습니다. 이것은 결과입니다. Insert order 단계. 개별 SQL 문을 보았고 테스트 했습니까?

나는 당신의 문제가 트랜잭션 제어와 관련이 있다고 생각하지 않습니다.

이것에 대한 경험은 없지만 부모 테이블에서 사용할 수없는 키 값을 지정한 것 같습니다. 죄송하지만 이보다 더 많은 도와 줄 수는 없습니다.

문제는 오류를 처리하는 방법입니다. 오류가 발생하면 트랜잭션이 자동으로 롤백되지 않습니다. 당신은 확실히 (그리고 아마도) 그것을 선택할 수 있지만, 앱이나 당신이 어디에 있는지에 따라 여전히 그것을 커밋하고 싶을 수도 있습니다. 그리고이 경우, 그것이 당신이하는 일입니다. 오류가 발생할 때 코드를 롤백하려면 오류 처리 코드를 래핑해야합니다.

오류는 라인 템이 적절하지 않은 것 같습니다. FK Orderid 주문 테이블에 순서의 삽입물에 의해 자율적으로 생성되었습니다. 당신은 당신이 ID를 확인했다고 말하고, 주문 세부 정보에서도 FKS를 확인 했습니까?

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