簡體   English   中英

實體框架7 AddRange()不添加外部實體

[英]Entity Framework 7 AddRange() Not Adding Foreign Entities

我已經使用EF Code First已有一段時間了,但這是我第一次使用EF7。

我有以下Model類,其中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();
    }

Shows表已正確初始化,但VenueId為null。 場地表完全是空的。

這是怎么回事?

DbSet.Add還有第二個參數。

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

盡管默認值為IncludeDependents (又名子實體),但EF7的Add()行為並未將Venue標識為Show的子代。 OnModelCreating ,需要指定VenueShow之間的關系。 請參閱EF7文檔中的關系

例:

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

但是即使如此,您仍然需要在Venue的新實例上調用.Add,因為Show不是Venue的依賴項(子項)。

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屬性用於定義兩個表之間關系的前鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM