엔티티 프레임 워크 7 AddRange () 외부 엔티티 추가 안 함

c# entity-framework entity-framework-core

문제

나는 EF Code First를 잠시 사용 해왔다. 그러나 이것은 EF7을 처음 사용하는 날이다.

Venue와 Show와의 일대 다 관계가있는 다음 모델 클래스가 있습니다.

public class Show
{
    public int Id { get; set; }
    public Venue Venue { get; set; }
    //...
}

public class Venue
{
    public int Id { get; set; }
    public string Name {get; set; }
    //...
    public List<Show> Shows { get; set; }
}

다음과 같이 DBContext를 설정합니다.

public class NettlesContext : DbContext
{
    public DbSet<Show> Shows { get; set; }
    public DbSet<Venue> Venues { get; set; } 

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        new ShowConfiguration(builder.Entity<Show>());
        new ImageConfiguration(builder.Entity<Image>());
    }
}

public class ShowConfiguration
{
    public ShowConfiguration(EntityTypeBuilder<Show> builder)
    {
        builder.Property(p => p.Id).IsRequired();
        builder.Property(p => p.Title).IsRequired();
    } 
}

public class VenueConfiguration
{
    public VenueConfiguration(EntityTypeBuilder<Venue> builder)
    {
        builder.Property(p => p.Id).IsRequired();
        builder.Property(p => p.Name).IsRequired();
    }
}

그런 다음 일부 시작 코드에서 다음과 같이 데이터베이스를 초기화합니다.

    private static void AddShows(NettlesContext db)
    {
        var shows = new List<Show>()
        {
            new Show()
            {
                Title = "Portland Country Dance Community Contra Dance",
                Venue = new Venue()
                {
                    Name = "Fulton Community Center",
                },
            },
            new Show()
            {
                Title = "Portland Roadhouse Contra Dance",
                Venue = new Venue()
                {
                    Name = "Milwaukie Community Club",
                },
            },
        };

        db.Shows.AddRange(shows);
        db.SaveChanges();
    }

VenueId가 null 인 경우를 제외하고는 Show 테이블이 제대로 초기화됩니다. Venue 테이블은 완전히 비어 있습니다.

무슨 일이야?

수락 된 답변

DbSet.Add 의 두 번째 인수가 DbSet.Add .

Add(TEntity entity, GraphBehavior behavior = GraphBehavior.IncludeDependents)

IncludeDependents (자식 엔티티라고도 함) 기본값이지만 Add() 의 EF7 동작은 VenueShow 의 자식으로 식별하지 않습니다. OnModelCreating 에서 VenueShow 의 관계를 지정해야합니다. EF7 문서의 관계 를 참조하십시오.

예:

modelBuilder.Entity<Venue>(entityBuilder =>
{
    entityBuilder
        .HasMany(v => v.Shows)
        .WithOne(s => s.Venue)
        .HasForeignKey(s => s.VenueId);
});

그러나이 경우에도 Show는 Venue의 종속 (자녀)이 아니기 때문에 Venue의 새 인스턴스에 .Add를 추가로 호출해야합니다.

private static void AddShows(NettlesContext db)
{
    var fulton = new Venue()
            {
                Name = "Fulton Community Center",
            };
    var club = new Venue()
            {
                Name = "Milwaukie Community Club",
            };
    db.Venues.Add(fulton);
    db.Venues.Add(club);

    var shows = new List<Show>()
    {
        new Show()
        {
            Title = "Portland Country Dance Community Contra Dance",
            Venue = fulton,
        },
        new Show()
        {
            Title = "Portland Roadhouse Contra Dance",
            Venue = club
        },
    };
    context.Shows.AddRange(shows);
}

주의 할 점 : .Add ()의 이러한 동작은 EF7 RC1에서 혼란의 원인이었으며 EF7 RC2에서 동작이 변경 될 수 있습니다. https://github.com/aspnet/EntityFramework/pull/4132를 참조 하십시오.


인기 답변

모델을 다음과 같이 업데이트해야합니다.

public class Venue
{
  public int Id { get; set; }
  public string Name {get; set; }
  //...
  public List<Show> Shows { get; set; }
 }
public class Show
{
  public int Id { get; set; }
  public int VenueId { get; set; }
  [ForeignKey("VenueId")]
  public Venue Venue { get; set; }
  //...
}

ForegnKey 특성은 두 테이블 간의 관계에 대한 foriegn 키를 정의하는 데 사용됩니다.




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