MyClass obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single();
Console.WriteLine(obj.MyProperty); // output = "initial"
Console.WriteLine("Waiting..."); // put a breakpoint after this line
obj = null;
obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single(); // same as before, but reloaded
Console.WriteLine(obj.MyProperty); // output still = "initial"
obj.MyOtherProperty = "foo";
dataContext.SubmitChanges(); // throws concurrency exception
3 번 줄 다음에 중단 점에 도달하면 SQL 쿼리 창으로 이동하여 수동으로 값을 "updated"로 변경합니다. 그런 다음 나는 계속 달리다. Linq는 객체를 다시로드하지 않지만 이전에 메모리에 있던 객체를 다시 사용합니다! 이것은 데이터 동시성을위한 거대한 문제입니다!
어떻게 Linq 분명히 메모리에 보관됩니다 개체의 숨겨진 캐시를 해제합니까?
EDIT - 리플렉션에서 Microsoft는 Linq 프레임 워크에서 그런 갈라지는 틈을 남겨 둡니다. 위의 코드는 내가 실제로하는 일의 어리석은 버전이며 내가 놓친 작은 미묘한 부분이있을 수 있습니다. 요컨대, 위의 결과가 맞는지 확인하기 위해 자신 만의 실험을한다면 감사하게 생각합니다. 또는 Linq를 동시 데이터 업데이트에 대해 견고하게 만드는 일종의 "비밀 스위치"가 있어야합니다. 근데 뭐?
+1 OMG, 정말 Gotcha입니다! C# Gotcha KB에이를 추가해야합니다 ... –
거기에 그의 조언을 따르고 ObjectTrackingEnabled = false로 설정하면 더욱 심하게 DB에서 읽을 수 있습니다. SubmitChanges를 할 수 없습니다! 그것은 정말로 삶을 어렵게 만듭니다! –
다음은 C# gotcha KB에 대한 링크입니다. http://stackoverflow.com/questions/241134/what-is-the-worst-c-net-gotcha –