6

일부 부모 레코드가 데이터베이스에 이미 삽입되어 있습니다. 이제 일부 자식 레코드를 추가하고 싶습니다.부모 레코드가 Entity Framework 코드를 사용하여 이미 존재하는 경우 자식 테이블에 레코드 삽입

  1. 는 부모 (A)를 검색
  2. 이 아이의 탐색 속성에 부모 레코드를 추가 새 자식 (B) 레코드
  3. 만들기 기록 이렇게하려면 나는 다음 단계를 따라 갔다. B.A = A
  4. SaveChanges를 호출하십시오.

이 문제는 EF가 새로운 부모를 삽입 한 다음 자식을 기존의 부모와 매핑하여 삽입하는 대신 새로 새로 삽입 된 부모를 가리키는 외부 키가있는 자식을 추가하는 경우입니다. 나는 또한 아이를 저장할 때 부모의 프라이 머리 키를 검사했고 그것은 데이터베이스에 존재한다.

부모와 자녀에 대해 데이터베이스 생성 ID를 사용하고 있습니다. 부모님과 자식을 동일한 컨텍스트 개체에서 추가/저장하면 잘 작동한다는 것을 알게되었습니다.

최대한 빨리 해결해야합니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

18

예 해당 작업에 대해 동일한 컨텍스트를 사용해야합니다. 그것이 요점이다. 동일한 컨텍스트를 사용하지 않으면 삽입 할 개체, 업데이트 한 개체 및 수정할 개체를 수동으로 제어해야합니다. 당신의 시나리오에서는 순서가 될 수 있습니다

context.Parents.Attach(parent); // just attach as unchanged 
context.Childs.Add(child); // add as inserted 
parent.Childs.Add(child); // make connection between existing and inserted object 
context.SaveChanges(); 

는 또 다른 방법은 다음과 같습니다 또한

child.Parent = parent; 
context.Childs.Add(child); // both child and parent are marked as inserted!!! 
context.Entry(parent).State = EntityState.Unchanged; // set parent as unchanged 
context.SaveChanges(); 
+1

두 번째 방법이 저에게 효과적이었습니다. 고마워. – Amit

+0

같은 문제가 발생했습니다. http://stackoverflow.com/questions/16131090/the-relationship-could-not-be-changed-the-foreign-key-properties-is-non-nulla/16131494?noredirect=에서 살펴볼 수 있습니까? 1 # comment23046042_16131494? smae 컨텍스트에서'MamConfiguration_V1'을 얻습니다. 변경 사항을 저장합니다. 같은 맥락에 붙어 있습니다. 흐름 : UI (편집 모드)에있는 ID로 MamConfiguration_V1 가져 오기 - UI에서 모든 값을 할당 -> 참조 회원 삭제 (탐색) 'MamConfigurationToBrowser_V1'. 정보를 추가 했습니까? –

+0

+1 매일 새로운 것을 배웠습니다. 그리고 지금까지 보아온이 문제에 대한 가장 좋은 설명입니다. 고맙습니다! –

0

, 경우에 당신과 같이있을 때 :

public class B 
{ 
[Key] 
public int Id {get;set;} 

public AId {get;set;} 

//... other properties here 

[ForeignKey("AId")] 
public virtual A ParentA {get;set;} 
} 

경우에만 설정할 수를 DB에있는 기존 AID 항목에 외래 키가없고 ParentA을 null로 남겨두고 context.SaveChanges()에 다른 키를 만들지 마십시오. DB에 입력).

관련 문제