2

다음 코드는 새 레코드를 만든 다음 데이터베이스에 커밋 된 후에 수정하려고 시도합니다. 마지막 SubmitChanges() 호출은 ChangeConflictException을 발생시킵니다. 나는 '만든'열은보고 CurrentValue에와 DatabaseValue가 동일한 등장에도 불구하고, 충돌 것을 발견 dataContext.ChangeConflicts을 검사하여DateTimeOffset 스케일로 인해 Linq에서 Sql으로 ChangeConflictException이 발생하는 것을 어떻게 막을 수 있습니까?

ItemA itemA = new ItemA(); 
itemA.Foo = "a"; 
itemA.Created = DateTimeOffset.Now.UtcDateTime; 

ItemAs.InsertOnSubmit(itemA); 
SubmitChanges(); 

itemA.Foo = "b"; 
SubmitChanges(); 

. 더 자세히 조사하자면, 틱스가 약간 다르다는 것을 알았습니다. 왜냐하면 나는 데이터베이스의 DateTimeOffset 열을 3의 눈금, 즉 밀리 초로 설정했기 때문에 그것은 .NET의 버전과 같지 않습니다. 저는 7의 스케일을가집니다. 결과적으로 Linq는 Sql 위의 삽입과 업데이트 사이에 불일치가 있음을 확인하고 무언가가 데이터베이스를 수정했다고 생각합니다.

.NET에서 정밀도를 수정하는 데 사용할 수있는 확장 메서드 또는 무언가를 작성하는 것 외에 다른 방법으로이 문제를 해결할 수있는 방법이 있습니까?


업데이트

나는 모델을 DateTimeOffset 열을 설정할 때 호출해야합니다 확장 방법에 의존해야했다. 나는이 방법처럼 정말하지 않습니다

EntityFoo.Created = DateTimeOffset.Now.ToUniversalTime(3) 

그것이 내가 수동으로 내가 데이터 컨텍스트가 일을해야한다고 생각 규모를 설정하는 의미로 :로 다음 호출 할 수 있습니다

public static DateTimeOffset ToUniversalTime(this DateTimeOffset dto, int scale) { 
    DateTimeOffset utc = dto.ToUniversalTime(); 
    return utc.AddTicks(-(utc.Ticks % (int)Math.Pow(10, 7 - scale))); 
} 

.

답변

1

항상 Universal Time을 사용하고 있으므로 DateTimeOffset이 DateTime보다 어떤 이점을 제공하는지 알 수 없습니다. Sql Server의 DateTime과 동일한 정밀도를 갖는 DateTime.UtcNow를 사용할 수 있습니다.

또는 SQL Server 2008을 사용할 때 데이터베이스를 DateTime2 형식으로 데이터베이스에 저장할 수 있습니다. 필요한 정확도가 추가적으로 있습니다.

+0

DTO를 사용하는 다른 이유가 있습니다. L2S 설계자가 더 잘 처리하지 못하는 것에 놀랐습니다 ... – LaserJesus

관련 문제