2010-03-01 5 views
4

우리는 Linq에 의해 생성 된 쿼리를 데이터 검색에 사용하지만 INSERT 및 UPDATE에 대해서는 생성 된 SQL을 허용하지 않고 저장 프로 시저를 사용하도록 제한합니다.업데이트 저장 프로 시저를 사용하는 Linq2SQL

DBML의 업데이트 및 삽입 동작을 저장 프로 시저에 연결했습니다. 절차가 호출되면 낙관적 동시성의 경우를 제외하고는 데이터가 삽입/업데이트 됨 = all 인 경우 입니다.

검색과 업데이트간에 레코드가 변경되면 업데이트가 실패합니다. Linq에이 업데이트 문 자체를 생성 할 때

, 그것은 예상대로 ChangeConflictException 있지만 예외이 발생되지 않는 저장 프로 시저를 사용하여 발생합니다.

감사합니다. 어떤 도움을 주셔서 감사합니다.

답변

3

업데이트 저장 프로 시저를 사용하도록 UPDATE 동작을 구성하면 Linq2SQL은 동시성 예외를 throw하지 않는 메서드를 생성합니다. 당신은 patial의 DataContext 클래스의 업데이트 방법 자신을 구현하고 ChangeConflictException을 던질 수있는 낙관적 동시성 I found a proposed solution in the MSDN forums

을 처리합니다.

이를 달성하기 위해 당신이에 :

  • 은 값이 변경되지 않은 경우에만 업데이트 할 WHERE columnA = OriginalValueA ...를 사용하여
    • 을 매개 변수로 현재의 원래 값을 사용 업데이트 저장 프로 시저를 작성
    • 저장 프로 시저의 마지막 줄은 RETURN @@ROWCOUNT
    • 입니다. rowcount를 사용하면 행이 업데이트되었는지 알 수 있습니다.
    • DBML에서
  • 은 부분 클래스는이 같은 업데이트 방법을 구현 xxxDataContext "사용 런타임"
  • 하려면 업데이트 동작을 설정 : 코드 Linq2SQL, 그냥 마지막 줄에 생성 어떤에서 가져
    • 예외
    • partial void UpdateYourEntityClass(YourEntityClass obj) 
           { 
            EntityClass original = ((YourEntityClass)(EntityClasss.GetOriginalEntityState(obj))); 
            int result = this.YourEntityClassUpdate((...)); 
            if (result == 0) throw new ChangeConflictException(); 
           } 
      
을 첨가 던져

작동하지만 단순하지는 않습니다. 다른 옵션은 있습니까?

0

이것은 놀랍지 않습니다. 업데이트 및 삭제 작업을 위해 저장 프로 시저를 호출 할 때 자신 만의 동시성 검사를 수행해야합니다. 기본적으로 저장된 procs를 사용하여 루프에서 L2S를 제거했기 때문에 L2S는이를 수행 할 수 없습니다.

삽입/업데이트/삭제를 수행 할 때 L2S 백 엔드와 함께 저장 프로 시저를 사용하지 않는 이유 중 하나입니다. 저장 프로 시저를 사용하는 또 다른 단점은 삽입/업데이트/삭제 문에서 강력한 형식 검사를 잃게된다는 것입니다.

+0

감사! DBML 디자이너를 사용하면 INSERT, UPDATE 및 DELETE 동작을 저장 프로 시저에 매핑 할 수 있습니다. 또한 원래 값을 업데이트 저장 프로 시저의 매개 변수에 매핑 할 수 있습니다. 누락 된 유일한 부분은 행 개수 검사와 ChangeConflictException을 던지는 것입니다. 그것의 모든 있지만 Designer.cs 생성 된 코드를 예외를 throw하지 않습니다. – PeterFromCologne

관련 문제