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

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; }
}

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

migrationBuilder.CreateTable(
                name: "Contact",
                columns: table => new
                {
                    Id = table.Column<string>(nullable: false),
                    FirstName = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Contact", x => x.Id);
                    table.UniqueConstraint("UK_Id", x => x.Id);
                });

            migrationBuilder.CreateTable(
                name: "Message",
                columns: table => new
                {
                    Id = table.Column<string>(nullable: false),
                    ContactId = table.Column<string>(nullable: true),                        
                    Source = table.Column<string>(nullable: true)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_Message", x => x.Id);
                    table.UniqueConstraint("UK_Id", x => x.Id);
                    table.ForeignKey(
                        name: "FK_Message_Contact_ContactId",
                        column: x => x.ContactId,
                        principalTable: "Contact",
                        principalColumn: "Id");
                });

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

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

최신 정보

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

    [TestMethod]
    public void ShouldSaveEntityParentRelationshipsCorrectly()
    {
        var message = new Message
        {
            Id = "2848"
            , IsUrgent = true
            , MessageType = MessageType.Inbox
            , Note = "One ring to rule them all"
            , Contact = new Contact
            {
                Id = "454545"
                , FirstName = "Frodo"
                , LastName = "Baggins"
            }
        };

        service.Save(message); //Foreign key constraint error

        var entity = service.Find<Message>()
            .Include(c => c.Contact)
            .First(p => p.Id == "2848");

        Assert.AreEqual("Frodo", entity.Contact.FirstName);
        Assert.AreSame(entity, message, "Messages are not the same");

        Assert.IsNotNull(entity.Contact);

        Assert.AreSame(message.Contact, entity.Contact, "Contacts are not the same");
    }

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

public virtual void Save<T>(T entity) where T : class, IEntity
    {
        var context = Context();
        var entry = context.Entry(entity);
        var state = entry.State;

        if (state == EntityState.Detached)
            Add(entity);
        else if (state == EntityState.Deleted)
            Remove(entity);
        else
            Update(entity);

        SaveChanges();
    }

    public virtual void SaveChanges()
    {
        try
        {
            Context().SaveChanges();
        }
        catch (DbUpdateConcurrencyException ex)
        {
            Logger.Current.Log(ex);
            throw ex;
        }
    }

    public T Add<T>(T entity) where T : class, IEntity
    {
        return Context().Set<T>().Add(entity).Entity;
    }

수락 된 답변

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는 합법적입니까? 예, 이유를 알아보십시오.