2011-04-21 7 views
2

개체를 가져 와서 NoTracking을 사용하여 변환하고 조작 한 다음 asp.net MVC보기로 보냅니다. 내가 편집 된 버전을 다시 얻을, 그것을 첨부하려고, 내 저장소에 편집 메서드를 호출하여, 다음과 같은 오류가 발생합니다 :엔터티 프레임 워크에서 개체를 분리하고 첨부 할 때 오류가 발생했습니다.

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

나는 데이터를 얻을 방법 :

IQueryable<User> query = db.Users.AsNoTracking(); 

어떻게 I 내가 AsNoTracking를 사용하여 개체를 얻을 때 그 날의 일을 분리해서는 안

public User UpdateUser(User user, IEnumerable<Expression<Func<User, object>>> properties) 
    { 
      db.Users.Attach(user); //Error happens right here. 
      foreach (var selector in properties) 
      { 
       string propertyName = Helpers.PropertyToString(selector.Body); 
       db.Entry(user).Property(propertyName).IsModified = true; 
      } 
      db.SaveChanges(); 
      return user; 
    } 

: 데이터를 편집? 분리되지 않은 경우에도 asp.net 수명주기 전체가 데이터를 다시 제출하면 다시 시작되어 그래프가 비어있게됩니다.

내가 뭘 잘못하고 있니?

나는 이런 식으로 내 바인딩을 수행

DbContext db = new DbContext("ConnStringName"); 
Bind<IUserRepository>().To<SqlServerUserRepository>() 
       .WithConstructorArgument("db", db); 
+0

사용자 개체에 어린이 컬렉션이 있습니까? 나는 최근에 두 개의 새로운 자식으로 부모 객체를 연결하면이 오류가 발생하는 문제가 발생했습니다. 아이들은 모두 ID 필드가 null이어서 "동일한 키"오류가 있습니다. –

+0

@Ed Chapel 'UpdateUser' 메소드에 보낸 것이 아닙니다. 모델에는 예가 있지만 데이터베이스에 이미 있습니다. –

+0

확인. db 컨텍스트가 세션이나 응용 프로그램에 저장되어 있습니까? 또는 모든 요청에 ​​대해 새 인스턴스를 만드십니까? –

답변

1

은 DB 컨텍스트 한 번 만들어 같은데 그 예를 효과적으로 싱글이다. User을 연결하려고하면 컨텍스트에서 이미 캐시에 하나가 있고 오류가 있음을 감지합니다.

요청 당 생성 할 컨텍스트를 변경하는 것이 좋습니다. Ninject에, 당신은 YourDbContextdb 변수의 유형과 CreateContext()이 global.ascx의 방법이다

Bind<YourDbContext>().ToMethod(context => CreateContext()).InRequestScope(); 

로 바인딩 할 수 있습니다.

당신은 참으로 한 번 데이터베이스 컨텍스트를 작성하고 싱글로 저장하는

UPDATE. 걱정, 각 요청에 대한 새로운 DbCOntext을 만들어 부착 할 때 제출 User 충돌에서 캐시 User을 방지 할 수

// DbContext db = new DbContext("ConnStringName"); 
Bind<DbContext>().ToMethod(context => new DbContext("ConnStringName")).InRequestScope(); 
Bind<IUserRepository>().To<SqlServerUserRepository>().InRequestScope(); 

이로 바인딩을 설정할 수 있습니다.

+0

에드, 제 바인딩이 어떻게 설정되는지 알려주세요. 바인딩을 사용하는 방법을 잘 모르겠습니다. 나는 나의 바인딩을 어떻게했는지에 대한 나의 질문을 편집했다. –

관련 문제