2009-11-04 5 views
0

ASP.NET MVC 애플리케이션에서 .NET 3.5 SP1을 사용하고 있습니다. "같은 키를 가진 개체가 이미 ObjectStateManager에 존재하는 ObjectStateManager는 여러 객체를 추적 할 수 없습니다 :HTTP 요청을 보유한 ObjectContext를 사용할 때 엔티티를 첨부합니다.

HTTP 요청 수명과 ObjectContext를 사용하고 상황에 이미 존재하는 엔티티를 첨부하려고 노력하는 동안, 우리는 오류를 얻을. 같은 열쇠. " 예를 들어 코드 : 카테고리 ID = CategoryIdSelected와 '카테고리'ObjectContext는에있는 경우

Category newCategory = new Category {CategoryId = CategoryIdSelected}; 
ctx.AttachTo("CategorySet", newCategory); 

오류를 줄 것이다.

Category newCategory = new Category {CategoryId = CategoryIdSelected}; 
ObjectStateEntry stateEntry = null; 

if(ctx.ObjectStateManager.TryGetObjectStateEntry(newCategory, out stateEntry)){ 
    //EntityObject already attached in context, get it 
    newCategory = (EntityObject)stateEntry.Entity; 
}else{ 
    ctx.AttachTo("CategorySet", newCategory); 
} 

수정 된 코드가 여전히 제공되는 동일한 에러 : 가 "[System.InvalidOperationException] = {"동일한 키를 가진 개체가 이미 ObjectStateManager 존재

수정 코드는 기존의 엔티티 확인 . ObjectStateManager는 동일한 키를 사용하여 여러 개체를 추적 할 수 없습니다 "

알려 주시기 바랍니다

당신에게


질문 부칙 감사합니다.? 가진 ObjectContext를를 사용하는 경우 엔티티를 부착

더 많은 문제를 HTTP 요청의 수명.

예를 들어 'AppUser', 'Category'및 Department 엔티티가있는 경우.

public class AppUser : System.Data.Objects.DataClasses.EntityObject{ 
public int Uid {get; set;} 
public string UserName {get; set;} 
public string Password {get; set;} 
public Department Dept {get; set;} 
public Category catg {get; set;} 
........... 
} 

AppUser는 부서 및 카테고리 엔터티와 관련이 있습니다. '사용자'에 연결하려고 할 때 지금 :

user = new AppUser{Uid=1,catg = new Category {categoryId=10}, Dept = new Department{departmentId=101}, ...} 
var key = ctx.CreateEntityKey("AppUserSet", user); 
if (ctx.ObjectStateManager.TryGetObjectStateEntry(key, out stateEntry)) { 

는 상황에서, 경우에만 작동합니다 : 카테고리 ID = 10 NO 카테고리가 없습니다

  • 은 departmentId와 NO 부서가 = 101

하나의 옵션은 항상 NOMERGE NoTracking 옵션을 사용하여 검색하여 컨텍스트에 첨부 된 엔터티가 없는지 확인하는 것입니다. 하지만 나는 MergeOption.NoTracking와 함께 다음과 같은 문제를 발견 여전히 DB를 초래

  • 두 번째 호출 당신은 EntityRefs에 EntityKeys을하지 않는
  • 을했다. 그래서 XXXReference의 EntityKey는 null입니다. 이것은 FK 스텁이 없음을 의미합니다. Please see.
    양쪽 엔티티 (양쪽 엔티티)를로드하지 않고 참조의 EntityKey를 얻는 방법은 무엇입니까?
  • Entity가 분리 되어도 Entity._realtionships._context를 통해 DataContext에 대한 참조가 있습니다.Please see.

알려 주시기 바랍니다.

감사합니다.

답변

0

코드에서 서로 다른 두 가지 상황을 사용하고 있습니다. 당신은 하나 확인하고 다른 연결 :

if(csContext. //...){ 
    /// 
}else{ 
    ctx. // ... 
} 

엔티티는 ctx에 나타납니다,하지만 csContext인치 가능한 한 항상 한 번에 하나의 컨텍스트를 사용하는 것이 좋습니다. 훨씬 덜 혼란 스럽습니다.

업데이트

OK, 당신은 귀하의 질문에 코드를 변경했습니다.

내 생각 엔 스텁 개체에 EntityKey가 없으므로 TryGetObjectStateEntry가 false를 반환합니다. 시도 :

if(ctx.ObjectStateManager.TryGetObjectStateEntry(
    new EntityKey("MyEntities.CategorySet", "CategoryId", CategoryIdSelected), 
    out stateEntry)){ 

분명히 "MyEntities"는 실제 모델 이름으로 대체하십시오.

+0

고마워요! 그것은 같은 맥락입니다. 오타를 바로 잡았습니다. – dev

관련 문제