LINQ to SQL이 다른 데이터 컨텍스트에서 개체 업데이트 연결을 끊었습니다.

StackOverflow https://stackoverflow.com/questions/273578

문제

http://geekswithblogs.net/michelotti/archive/2007/12/17/117791.aspx

저는 C#과 함께 ASP.NET을 사용하고 있으며 위에 링크된 블로그에 표시된 대로 데이터 컨텍스트를 업데이트하기 위해 linq to sql을 사용하려고 합니다.명시된 대로 테이블에 타임스탬프 필드를 생성했으며 다음 방법을 사용하고 있습니다.

private void updateRecord(TableName updatedRecord)
{
 context db = new context();
 db.TableName.Attach(updatedRecord,true);
 db.SubmitChanges();
}

제 질문은 데이터 컨텍스트에서 Attach 메서드를 호출하기 전에 updateRecord의 항목에 timeStamp 필드를 할당해야 한다는 것입니다.

이 코드를 실행하면 다음 예외가 발생합니다. System.Data.Linq.ChangeConflictException: Row not found or changed. 이 업데이트 메서드에 개체를 전달하기 전에 업데이트할 레코드의 기본 키를 포함하여 모든 필드를 업데이트합니다.디버깅하는 동안 개체의 TimeStamp 특성이 null로 표시됩니다.그렇게 되어야 할지 말아야 할지 잘 모르겠습니다.

내가 가지고 있는 모든 책과 자료는 이것이 그렇게 하는 방법이라고 말하지만, 그 어느 것도 이 TimeStamp 속성에 대해 자세히 설명하지 않습니다.

나는 이것이 빠르고 쉽다는 것을 알고 있습니다. 누구든지 알고 계시다면 알려주세요.

도움이 되었습니까?

해결책

타임 스탬프 열이 있다면 (바닐라 객체에서) 레코드를 업데이트하려면 : 예, 할당해야합니다. 그렇지 않으면 낙관적 동시성 검사를 위해 타임 스탬프를 사용하는 능력이 상실됩니다.

아이디어는 (분리 된) 객체를 잡을 때 타임 스탬프의 사본을 가져간 다음 업데이트 할 때이 열을 사용하여 다른 사람이 행을 편집하지 않았는지 확인할 수 있습니다.

두 가지 일반적인 시나리오가 있습니다.

1 : 짧은 수명 만 수행하는 경우 먼저 데이터베이스에서 레코드를 가져 오십시오. 먼저 객체를 변경하고 간단히 SumBitchanges () [모두 동일한 데이터 컨텍스트를 사용하여]. 데이터 컨텍스트는 동시성을 처리합니다.

2 : 객체를 연결 해제하는 경우 (예 : 클라이언트 응용 프로그램에 잠시 전달) 직렬화와 같은 것을 사용합니다 (LINQ-to-SQL 객체는 DataContractSerializer를 지원합니다 (선택적으로, 활성화해야 함). 따라서 서버의 객체를 직렬화하고 클라이언트에게 전달하십시오. 클라이언트는 사본을 변경하고 다시 전달합니다. 서버는이를 제외하고 attach () 및 submitchanges ()를 사용합니다. 메모리의 레코드는 여전히 데이터베이스에서 추출했을 때의 타임 스탬프가 있어야하므로 레코드가 연결이 끊어진 시간에 따라 항상 낙관적 동시성을 수행 할 수 있습니다.

다른 팁

테이블에 타임스탬프 필드를 생성하셨다고 하셔서 나중에 이 컬럼을 추가할 경우 컬럼 속성이 제대로 설정되지 않을 수도 있지 않을까 싶습니다.DBML 디자이너에서 TimeStamp 열의 속성을 확인할 수 있습니다.다음 사항을 확인하세요.

AutoGenerated = true
Auto-Sync = Always
Time Stamp = True
Update Check = Never

서버 데이터 유형은 다음과 같아야 합니다. rowversion NOT NULL

자동 생성 및 항상 동기화되도록 설정되지 않은 경우 삽입이 완료될 때 행 버전을 변경하지 않았으므로 삽입에서 행 버전이 반환되지 않습니다.이 값이 데이터베이스에 의해 생성되더라도 DataContext는 이를 적절하게 처리할 수 있도록 이를 알아야 합니다.

또한 이제 타임스탬프 열이 있으므로 UpdateCheck 으로 설정해야 합니다 Never 다른 모든 열에 대해.

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