2011-08-09 3 views
23

엔티티를 수신 한 다음 업데이트해야하지만 추적 할 필요가 없으므로 컨텍스트에 다시 첨부 할 수 있습니다.엔티티 프레임 워크 모델에서 추적 기능을 먼저 끕니다.

본인은 EntityFramework.dll (4.1)을 가지고 있습니다. 모델에서 데이터베이스를 생성했습니다. (코드 우선이 아님).

가져 오기 사용자 :

db.Users.MergeOption = MergeOption.NoTracking; 
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only. 

return query; 

업데이트 사용자 :

db.Users.Attach(user); //error here. 
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user); 
entry.SetModifiedProperty(propertyName); 
db.SaveChanges(); 
return user; 

오류 : 내가 전화

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

이 같은 방법

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId); 
user.Identifiers.Add(someIdent); 
userRepository.UpdateUser(user); 
+0

그래야합니다. 다른 검색어로 사용자를받지 못하셨습니까? –

+0

@ 라디 슬라브 동일한 검색어. 난 단지 1 읽기/그 코드를 사용하는 저장소에 방법을 얻을 –

+0

난 그냥 모든 저장소 부담없이 비슷한 코드를 테스트하고 그것은 나를 위해 작동합니다. –

답변

7

분리 및 부착하는 대신. 원래 컨텍스트와 다를 수있는 항목 업데이트를 처리하려면 다음을 수행 할 수 있습니다.

var originalItem = db.Users.Find(user.UserId); 
db.Entry(originalItem).CurrentValues.SetValues(user); 
db.SaveChanges(); 
+3

내 개체 (originalItem)에 하위 엔터티의 컬렉션 인 속성이있을 때이 기능이 작동하지 않는 것 같습니다. 이 사건을 위해 내가해야 할 특별한 것이 있습니까? –

17

없음 추적 쿼리 것은 때때로 당신이 개체를 쿼리하지만 개체가 컨텍스트에 의해 추적하지 할 수 있습니다.하지 읽기 전용 시나리오에서 많은 수의 엔터티를 쿼리 할 때 성능이 향상 될 수 있습니다. AsNoTracking 확장 메서드는 쿼리를 실행하고 컨텍스트에서 추적하지 않고 결과를 반환합니다. 다음 예제에서 쿼리는 객체를 반환하지만 컨텍스트에서 추적하지는 않습니다. 기타

 // Query for all departments without tracking them 
     var departments1 = context.Departments.AsNoTracking().ToList(); 

     // Query for some departments without tracking them 
     var departments2 = context.Departments 
       .Where(d => d.Name.StartsWith("math")) 
       .AsNoTracking() 
       .ToList(); 
+0

견적 소스 : https://msdn.microsoft.com/en-us/data/jj556203.aspx –