3

엔티티 변경 사항을 롤백 할 방법을 찾고 있습니다. 엔티티 상태를 설정하는 방법을 보여주는 this answer을 보았습니다. 그러나 을 호출하거나 엔티티 상태를 조작하지 않고 간단히 내 dbContext 인스턴스를 처리하면 어떻게되는지 궁금합니다.DbContext.SaveChanges를 호출하지 않고 DbContext.Dispose를 호출하면 어떻게됩니까?

내가 작성한 코드는 확실히 작동하지만,이 방법으로 변경 사항을 거부하여 불안정한 상태로 아무것도 남겨두고 있지 않습니까?

답변

3

() 또는 개체를 조작하는 것은

아무것도 주장하지 않습니다. 현재 폐기 된 DbContext 인스턴스에 이전에 부착 된 인스턴스는 정상적인 인스턴스가 무언가에 의해 인스턴스에 핸들이 있다고 가정하므로 계속 존재합니다. 거기에 메모리가 릴리스되고 결국 아무 것도 아닌 다른 일반적인 인스턴스로 가비지 수집됩니다 경우 핸들이 없을 것입니다. 메모리에있는 엔티티의 상태는 그대로 유지되며 메모리의 어떤 것도 자동으로 되돌려지지 않습니다. 데이터베이스 저장소는 DbContext에서 데이터 저장소로의 호출이 없음을 의미하는 "있는 그대로"로 유지됩니다.

내가 적어도 데이터 저장소에서,이 방법

없음에 거부 변화에 의해 불안정한 상태에서 아무것도 떠납니다. 메모리에서 말하기는 어렵습니다. 코드가 중단 된 위치와 그 시점까지 수정 사항에 대한 종속성에 따라 달라집니다. 상태 비 저장 asp.net 응용 프로그램을 가정 할 수 있습니다. 요청이 단순히 끝나고이 경우 데이터 저장소에서 필요한 항목을 다시 가져와야하므로 다음 요청 중 하나라도 불안정한 상태가 발생하지 않아야합니다.

Windows 응용 프로그램처럼 오래 살았다면 이전에 추적 중이던 인스턴스에 대한 포인터/핸들러가 현재 되돌리기 상태의 메모리 상태로 업데이트되거나 해당 포인터를 릴리스하는지 수동으로 확인해야 할 수 있습니다.

는 지금까지 새로운 DbContext 인스턴스에 관한 한 그들은 모두 그렇게 그들 사이에 계속이없는 서로 독립적으로 작동합니다. 새로운 DbContext는 추적중인 상태 또는 다른 DbContext 인스턴스에 의해 추적 된 상태에 대해 알지 못합니다.

+1

이것은 실제로 내 질문을 해결하는 유일한 대답이다. 처리 방법을 설명하는 대신 DbContext 자체 내의 엔터티에 초점을 둡니다. 어쨌든, 당신이 말한 것은 말이됩니다. 컨텍스트의 엔티티는 참조가 없을 때마다 GC 할 다른 객체와 마찬가지로 존재합니다. '.SaveChanges()'를 호출하지 않으면 변경 사항이 데이터베이스로 푸시되지 않습니다. 곧 답변으로 표시 할 가능성이 높습니다. – oscilatingcretin

3

IDisposable을 구현하는 클래스에 대해 Dispose() 메서드를 호출하면 라이브러리에 "이 객체로 작업을 마쳤습니다. 더 이상 사용하지 않습니다. 필요에 따라 정리할 수 있습니다."라고 의미합니다. 이는 Entity Framework에만 해당되는 것은 아닙니다.

대부분의 클래스에서 Dispose()을 호출 한 후에도 개체를 계속 사용하려는 시도는 실패하며 때로는 개체 상태가 손상되어 내부 예외로 인해 문제를 경고하는 명시 적 예외가 발생하는 경우도 있습니다. Entity Framework에서 예외가 있다고 가정해서는 안됩니다. dbContext.Dispose()을 호출 한 후에는 더 이상 dbContext이 참조하는 컨텍스트를 사용하지 않아야합니다.

그러나 직후 새로운 컨텍스트를 만드는에서 당신을 중지 아무것도 없다 :

dbContext.Dispose(); 
dbContext = new DbContext(); 

이 새로운 컨텍스트는 이전 상황에서 만든 저장되지 않은 모든 변경 사항의 전혀 기억이 없습니다. 이 접근법이 가장 실용적인 사례가 많이 있습니다.

0

아무 것도 불안정한 상태가 아니므로 걱정할 필요가 없습니다. 처리 한 후에 컨텍스트를 호출하려고하면 ObjectDisposedException이 표시되고 그렇지 않으면 더 이상 필요하지 않은 경우 처분하는 것이 타당합니다.

단순히 dbContext.SaveChanges를 호출하지 않고 내 dbContext 예를 처분하는 경우 발생하는