엔티티 프레임 워크에서 상위 엔티티를 일대 다 관계로 저장할 수 있습니까?

c# entity-framework entity-framework-core one-to-many

문제

나는 두 엔티티 사이에 단순한 일대 다 관계를 가지고있다.

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

마이그레이션은 다음과 같습니다.

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

이제 새로운 Contact 를 만들고 Messages 속성에 새 Message 를 추가하고 문제없이 저장할 수 있습니다. 연락처를로드하면 관련된 모든 메시지가 표시됩니다. 아무런 문제가 없습니다.

내가 궁금해하는 점은 이것을 역순으로하는 방법이다. 새 메시지를 만들려고합니다 (아직 db에 존재하지 않음). Contact 속성을 새 연락처 개체로 설정하고 저장하십시오. 결국 외래 키 제약 조건이 생깁니다. (이는 의미가 있습니다. 연락처가 저장 될 때까지 메시지를 저장할 수 없습니다.) 그러나 엔티티 프레임 워크는 관계를 파악하고 메시지 앞에 연락처를 삽입하는 것을 알만큼 똑똑하다고 생각했습니다. 내가 잘못된 것을 구성하고 있습니까?

최신 정보

여기에 전달하려고하는 단위 테스트가 있습니다.

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

무슨 service.Save 가 후드 밑에서하는거야.

public class Contact
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    // the children
    public List<Message> Messages { get; set; }
}

public class Message
{
    public string Id { get; set; }
    public string ContactId { get; set; }
    public string Source { get; set; }
    // the parent
    public Contact Contact { get; set; }
}

수락 된 답변

beta8 이상에서는 DbSet.Add() 가 엔터티 와 그 자식을 추가합니다. ContactMessage 의 부모이기 때문에이를 먼저 명시 적으로 추가해야합니다.

    service.Save(message.Contact);
    service.Save(message);

자세한 내용은 https://github.com/aspnet/EntityFramework/pull/2979 를 참조 하십시오 .


인기 답변

사용중인 EF7 버전에 따라 다릅니다. 베타 7 이전 버전.

이전 버전의 EF와는 달리, 현재 EF7을 사용하는 객체에서 Add ()를 호출하면 관련 객체가 추가 된 것으로 표시되지 않습니다.

이것이 베타 8에서 해결 된 것 같습니다. 더 많은 정보는 여기에 있습니다 .




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.