2009-03-19 3 views
15

저는이 문제로 고통스러워하고 있습니다. 누군가 도와 주면 대단히 감사하겠습니다.Linq에서 SQL 업데이트로의 ChangeConflictException

데이터베이스의 단일 테스트 테이블에 DataContext가 첨부되어 있습니다. 업데이트를 항상 빈으로 ChangeConflictException을 얻을 - Linq에 사용

CREATE TABLE [dbo].[LinqTests](
    [ID] [bigint] IDENTITY(1,1) NOT NULL, 
    [StringValue] [varchar](255) NOT NULL, 
    [DateTimeValue] [datetime] NOT NULL, 
    [BooleanValue] [bit] NOT NULL, 
    CONSTRAINT [PK_LinqTests] PRIMARY KEY CLUSTERED ([ID] ASC)) 
ON [PRIMARY] 

, 나는 검색 및 테스트 테이블에서 행을 삭제, 추가 할 수 있습니다,하지만 난 행을 업데이트 할 수 없습니다 다음과 같이 테스트 테이블입니다 ObjectChangeConflict.MemberConflicts 컬렉션입니다. 사용 된 코드는 다음과 같습니다.

다음은 DataContext를 통해 수행되는 업데이트의 로그 출력입니다.

UPDATE [dbo].[LinqTests] 
SET [StringValue] = @p3 
WHERE ([ID] = @p0) AND ([StringValue] = @p1) AND ([DateTimeValue] = @p2) AND (NOT ([BooleanValue] = 1)) 
-- @p0: Input BigInt (Size = 0; Prec = 0; Scale = 0) [1] 
-- @p1: Input VarChar (Size = 15; Prec = 0; Scale = 0) [I am in loop 1.] 
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [3/19/2009 7:54:26 PM] 
-- @p3: Input VarChar (Size = 34; Prec = 0; Scale = 0) [I am in loop 1. I've been updated.] 
-- Context: SqlProvider(Sql2000) Model: AttributedMetaModel Build: 3.5.30729.1 

이 쿼리는 클러스터 된 SQL Server 2000 (8.0.2039)에서 실행됩니다. 나는 내 인생에서, 여기서 무슨 일이 일어나고 있는지 파악할 수 없다. DB에 대해 비슷한 UPDATE 쿼리를 실행하면 정상적으로 작동하는 것 같습니다.

미리 도움을 청하십시오.

+0

당신이 행을 업데이트 할 때 내가는 SQL의 낙관적 동시성 전략에 Linq에 이해 업데이트 – eglasius

답변

28

나는 이것으로 무슨 일이 일어 났는지를 마침내 알게되었습니다. 분명히 "no count"옵션이이 서버에 대해 설정되었습니다.

Microsoft SQL Server 관리 Studio에서

: 2005

  1. 오른쪽 연결을 페이지
  2. 을 선택, 서버를 클릭 속성 서버 속성 창의 왼쪽에
  3. 을 클릭 기본 연결 옵션에서 "개수 없음"이 선택되지 않았는지 확인하십시오.

LINQ to SQL은 자동 낙관적 동시성 검사를 실행하기 위해 업데이트 후 @@ ROWCOUNT를 사용합니다. 물론 서버 전체에서 "개수 없음"이 설정되어 있으면 @@ ROWCOUNT는 항상 0을 반환하고 LINQ to SQL은 데이터베이스 업데이트를 실행 한 후 ConcurrencyException을 throw합니다.

LINQ to SQL에서 사용하는 유일한 업데이트 동작은 아닙니다. LINQ to SQL은 테이블에 TIMESTAMP 열이 있으면 @@ ROWCOUNT를 사용하여 자동 낙관적 동시성 검사를 수행하지 않습니다.

+6

고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. 고맙습니다. thx.ty –

+0

감사합니다. 감사합니다. 감사합니다. 감사합니다. – SqlSandwiches

+2

Linq에서 SQL 로의 올바른 조사는 서버에서 반환 된 'count'값을 사용할 수 있지만 "NO NOUNT가 ON 일 때라도 @@ ROWCOUNT 함수가 업데이트됩니다"이후 @@ ROWCOUNT를 사용하지 않습니다. [여기를보십시오] (http://msdn.microsoft.com/en-us/library/aa259204 (v = sql.80) .aspx) – Tomek

1

행을 검색 한 후 업데이트를 시도 할 때 데이터가 변경되었을 수 있습니까? LINQ-> SQL에는 생성 된 쿼리에서 볼 수있는 것처럼 현재 저장된 값에 대해 개체의 내용을 확인하는 자동 동시성 검사가 있기 때문에. DB의 행과 LINQ 개체의 추적 행 중 필드가 변경된 경우 업데이트가 실패합니다. 이 문제가 발생하고 정당한 이유가 있고 어떤 필드를 알고 있다면 DBML 디자이너에서 개체를 업데이트 할 수 있습니다. 원인에서 필드를 선택하고 "업데이트 확인"속성을 "안 함"으로 변경하십시오.

+2

에 사용하는 코드를 게시하시기 바랍니다,하지만 그것은 절대적으로 불가능 테스트 테이블의 이러한 행이 수정 된 것입니다. 흥미롭게도 TIMESTAMP 열을 테이블에 추가 할 때 ConflictChangeExceptions가 표시되지 않습니다. –

1

SQL Server 2008에서 동일한 문제가 발생했으며 연결 옵션 no count이 이미으로 바뀌 었습니다.대신 (Quintin 님 알 수 있듯이) 결코Update Check 속성을 변경의

, 나는 WhenChanged로 설정하고 문제가 해결되었다.

관련 문제