2011-04-12 5 views
19

다음 모델이 있습니다.EF 코드 ID 열이있는 첫 번째 부모 - 자식 삽입

class Parent 
{ 
    int ParentId (identity column) { get; set; } 
    string ParentName { get; set; } 
    virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    int ChildId (identity column) { get; set; } 
    string ChildName { get; set; } 
    int ParentID { get ; set; } //foreign key to Parent(ParentID) 
} 

단일 트랜잭션으로 부모와 자식에게 몇 개의 행을 삽입하려면 어떻게합니까? 기본적으로 부모 (내가 부모에 행을 삽입) 및 해당 값을 가진 자식 행을 삽입 생성 된 신원을 얻고 싶어? 코드 우선을 사용하여 어떻게 달성 할 수 있습니까?

답변

37

Child 개의 행을 삽입하려면 Parent의 ID 값이 얼마인지 걱정할 필요가 없습니다. 이 충분해야한다 : 당신은 항상 두 번 SaveChanges()를 호출 할 수있는 Child 개체를 삽입하기 전에 당신이 정말이 ID가 필요합니다 그래서 만약

기록을 위해
var parent = new Parent 
{ 
    // fill other properties 

    Children = new List<Child>() 
} 

parent.Children.add(new Child { /*fill values */); 

dbContext.Parents.Add(parent); // whatever your context is named 
dbContext.SaveChanges(); 

는 ID 년대는 SaveChanges()를 호출 한 후 할당됩니다.

다시 말하지만, 이것은 꼭 필요한 것은 아닙니다. 그런데

, 나는 Child에서 Parent에 탐색 속성 외부 키 속성을 만드는 것이 좋습니다, 그래서 같이 Child 클래스는 보일 것이다 : 당신은 항상하지 않고 직접 아동의 부모에 액세스 할 수 있습니다

class Child 
{ 
    public int ChildId { get; set; } // identity column 
    public string ChildName { get; set; } 
    public virtual Parent Parent { get ; set; } //foreign key to Parent 
} 

그 방법 명시 적으로 데이터베이스에서 직접 검색해야합니다 (게으르며로드됩니다).

+0

'SaveChanges' 및'dbContext.Parents.Add (parent) '를 사용 했습니까? –

+0

@ 라디 슬라브 - 예, 예, 답장을 수정했습니다. 감사합니다. 내가 대답했을 때 작업 단위 구현을보고있었습니다. 혼란 스러웠습니다. –

+1

엔티티 프레임 워크는 먼저 부모와 자식을 삽입합니다. 'parent-> newly_created_parent_id'에 삽입하고'자식 (..., parent_id) 값 (..._ 새로 생성 된 부모 _id)'에 삽입하십시오. 나는 이것을 테스트했고 당신이 말한 것처럼 작동하지만, 나는이 동작을 기술 한 문서를 찾고있다. 또는 문서화 (msdn)하기에 너무 논리적입니까? – broadband

관련 문제