1

엔티티 프레임 워크 4.1을 사용하고 있으며 asp.net mvc에서 먼저 코드를 사용하고 있습니다. 그냥 내가 코드 (컨트롤러) 아래 쓴 것을 시험 해보려고. 당신이 볼 수 위의 코드에서는엔트리 상태 변수를 직접 읽을 때 및 변수에서 읽을 때 다른 값을 표시합니다.

public ActionResult Foo() 
{ 
    StringBuilder sb = new StringBuilder(); 
      using (var db = new DemoDataBase1Context()) 
      { 
       //get person from db 
       var person = db.Persons.FirstOrDefault(); 

       //get entry 
       var entry = db.Entry(person); 

       //now change the person object 
       person.Name = "Some New Value"; 

       //print entity state 

       //this is showing unchanged 
       sb.Append("<br>State: " + entry.State); 

       //this is showing changed 
       sb.Append("<br>State: " + db.Entry(person).State);     
      } 

    return Content(sb.ToString()); 
} 

스피 내가 할 경우 그것의 변경되지 않은 말 entry.State을하고 db.Entry(person).State는 속담이 변경되었습니다. 어느 이유를 설명 할 수 있습니까 ??

답변

2

당신은 내부적으로 DetectChanges를 호출 Entry (EF 4.1의 기본입니다)를 활성화 자동 변경 감지가있는 경우. db.Entry(person)의 두 번째 호출 객체가 변경에서

if (Configuration.AutoDetectChangesEnabled) 
    ChangeTracker.DetectChanges(); 
//... 

을하고 DetectChanges 방법은 현재 값으로 개체를로드 할 때 만들어진 스냅 샷을 비교하여이를 감지 : 방법이 아마 비슷한 시작합니다. 차이가 있으므로 Unchanged에서 Modified으로 상태가 변경됩니다.

또한 변화가 Modified 때문에 DbEntityEntry.State로 이동하기 전에 사용자가 만든 entry 개체의 State 가능성이 단지 모두 DbEntityEntry 객체의 같은 인스턴스를 유지 내부 _internalEntityEntryState 값을 전파 한 속성입니다. 당신이 정말로 기업의 이전 상태를 저장하려면

당신이 State 자체를 저장해야합니다,뿐만 아니라 entry 객체 :

var state = db.Entry(person).State; 

이것은 단지 열거하고 이후로 변경되지 않습니다 Entry으로 전화하십시오.

당신이 자동 변경 감지를 사용하지 않는 경우 당신은 행동이 동작을 비교할 수 있습니다

: EF 더 이상 지금 POCO의 하나를 통지하지 않기 때문에

db.Configuration.AutoDetectChangesEnabled = false; 

sb.Append... 라인이 경우 상태 Unchanged를 받게됩니다 DetectChanges이 호출되지 않았기 때문에 속성이 변경되었습니다.

1

Entry 메서드는 Entry를 호출 할 때와 마찬가지로 개체의 상태를 제공한다고 생각합니다. 변수와 변수를 직접 호출하는 것과는 관계가 없다고 생각합니다.

첫 번째 항목을 참조하면 개체가 변경되지 않습니다. 바로 다음 줄에서 변경하고 Entry를 다시 호출하면 변경됩니다. 당신이에 대한 참조를 저장하는 경우 다음 나는 그들이 다른 참조입니다 추측하고있는 두 개의 비교 :

var person = db.Persons.FirstOrDefault(); 

// get reference to entry - unchanged at this point 
var entry1 = db.Entry(person); 

// make a change to the object 
person.Name = "Changed"; 

// get reference to entry - changed now 
var entry2 = db.Entry(person); 

// these will not be equal: probably false 
var equalOrNot = entry1 == entry2; 
+0

방금 ​​확인했습니다 :이 문 다음에'var entry2 = db.Entry (person);'| 'entry1.State'와'entry2.State'는 모두 Modified입니다. 지금 나는 방금'var entry2 = db.Entry (person); '을 주석 처리했다.'entry1.State'는 Modified를 보여준다. 나는 왜 그 일이 일어날 지 모른다. –

+0

코드를 업데이트하여 수행중인 작업을 표시하십시오. 테스트를 마쳤을 때 예상대로 작동했습니다. – Dismissile

관련 문제