Entity Framework 7 AddRange () no agrega entidades externas

c# entity-framework entity-framework-core

Pregunta

He estado usando EF Code First por un tiempo, pero esta es mi primera vez con EF7.

Tengo las siguientes clases de modelos en las que Venue tiene una relación de uno a muchos con Mostrar:

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

Configuré el DBContext así:

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

Luego, en algún código de inicio, inicializo la base de datos de esta manera:

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

La tabla Shows está correctamente inicializada, excepto que VenueId es nulo. La mesa del local está completamente vacía.

¿Que esta pasando?

Respuesta aceptada

Hay un segundo argumento para DbSet.Add .

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

Aunque el valor predeterminado es IncludeDependents (también conocido como entidades IncludeDependents ), el comportamiento de EF7 de Add() no identifica a Venue como un elemento secundario de Show . En tu OnModelCreating necesitas especificar la relación entre Venue y Show . Ver Relaciones en los documentos EF7.

Ejemplo:

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

Sin embargo, incluso con esto, aún tendrá que llamar. Agregue en las nuevas instancias de Venue porque Show no es un dependiente (hijo) de 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);
}

Cabe destacar: este comportamiento de .Add () ha sido una fuente de confusión en EF7 RC1 y su comportamiento puede estar cambiando en EF7 RC2. Consulte https://github.com/aspnet/EntityFramework/pull/4132


Respuesta popular

Necesitas actualizar tu modelo como este

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

El atributo ForegnKey se utiliza para definir la clave de avance de la relación entre dos tablas



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué