2014-04-14 2 views
0

다른 개체의 가상 컬렉션을 보유하고있는 개체가 있습니다. 내가 새로 삽입 된 개체에 대한 가상 컬렉션을 채워 데이터를 삽입하려고하면 같은 키를 가진 개체가 이미 존재한다는 오류가 발생합니다.같은 키를 가진 객체가 이미 존재합니다 objectstatemanager

엔티티를 만들지 않으면 0 값의 ID 필드를 갖게된다는 것을 알고 있습니다. 하지만 메인 테이블에 데이터를 저장할 때 데이터 컬렉션을 저장해야합니다.

public virtual void Insert(TEntity entity) 
    { 
     ((IObjectState)entity).ObjectState = ObjectState.Added; 
     entityDbSet.Attach(entity); 
     dataContext.SyncObjectState(entity); 
    } 

이것은 내가 사용하고있는 삽입 방법입니다. 아래는이 작업을위한 poco 클래스 (데이터 컬렉션을 유지하기 위해 클래스를 확장하기위한 부분 구현)입니다.

public partial class UserDefinedData 
{ 
    public int ID { get { return this.UserSelectedDValueID; } set { this.UserSelectedDValueID = value; } } 
    public string Name { get { return this.entityTypeName; } } 

    public virtual AM_AssetLocations AM_AssetLocations { get; set; } 
} 

public partial class AM_AssetLocations 
{ 
    // Reverse navigation 
    public virtual ICollection<UserDefinedData> UserDefinedDatas { get; set; }    
} 

json을 사용하여 데이터를 전달합니다. 또한 올바른 것으로 보인다. 데이터의 가상 컬렉션이 엔티티에 올바르게 추가되기 때문입니다.

{"entity":{"ID":"0","CreatedByID":"0","CreatedDate":"04-13-2014 10:48","ModifiedByID":"","ModifiedDate":"","DeletedByID":"","DeletedDate":"","Deleted":"false","Name":"h","Active":"true","DisplayOrder":"0","Test Decimal":"10","":"","Test Number":"10","Test Plain Text":"h","Test RTF":"<p>hsj</p>","Test Yes No":"false","Test Yes No 2":"true","TestDate":"01-Apr-2014","TestDateTime":"10:00 AM","UserDefinedDatas":[{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"123","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"124","ValueListItemID":"25"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"122","ValueNumber":"10"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"117","ValueString":"h"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"119","ValueString":"<p>hsj</p>"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"125","ValueYesNo":0},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"126","ValueYesNo":1},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"120","ValueDate":"01-Apr-2014"},{"EntityType":"AM_AssetLocations","EntityTypeID":"0","CreatedByID":"0","UserDefinedFieldID":"121","ValueDate":"08-Apr-2014 10:00 AM"}]}} 

이 문제를 해결하는 데 도움을주십시오.

참고 : ID 자체 필드를 할당하려고하면이 동일한 키 예외를 해결하기 만하면 참조 무결성 예외가 발생합니다. 나는 현실적인 콜렉션 저장이 잘 작동한다는 것을 안다. 하지만 그것은 나를 위해 작동하지 않습니다. 제게 이것에 대한 지침과 해결책을주세요.

감사합니다,

+0

'SyncObjectState'는 무엇을하고 있습니까? BTW이 JSON 문자열은 가로 스크롤에 쓸모가 없습니다. 덕분에 –

답변

1

Attach 기존 엔티티를 부착입니다 sachin.

컨텍스트 도와위한 .. 귀하의 경우

public virtual void Insert(TEntity entity) 
{ 
    //((IObjectState)entity).ObjectState = ObjectState.Added; 
    context.TEntityDbSet.Add(entity);//Add, not Attach! 
    //dataContext.SyncObjectState(entity); 
    context.SaveChanges() 
} 

에서 수동으로 할 필요가 없습니다, 적절한 상태를 http://msdn.microsoft.com/en-us/data/jj592676.aspx

+0

. 동일한 키 오류가 해결됩니다. 이것은 완전한 해결책이 아니지만 동일한 핵심 오류를 확실히 해결합니다. 그래서 대답으로 받아 들여 다른 사람들에게 도움이 될 수 있습니다. –

0

안녕 감사를 모두 자체를 할당해야합니다. 이 작업을 수행하는 방법이 변경되었습니다. 나는 주 엔티티를 받아들이는 저장 프로 시저와, .net 페이지에서 데이터 세트로 전달 될 수있는 자식 콜렉션의 테이블 유형을 정의했다. 그리고 이것은 나를 위해 잘 작동합니다.

감사합니다.