Entity Framework 7 AddRange () che non aggiunge entità esterne

c# entity-framework entity-framework-core

Domanda

Ho usato EF Code First per un po 'ma questa è la mia prima volta con EF7.

Ho le seguenti classi di modelli in cui Venue ha una relazione uno-a-molti per Mostra:

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

Ho impostato il DBContext in questo modo:

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

Quindi, in alcuni codici di avvio, inizializzo il database in questo modo:

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

La tabella Shows è correttamente inizializzata tranne che il VenueId è nullo. La tabella Venue è completamente vuota.

Cosa sta succedendo?

Risposta accettata

C'è un secondo argomento per DbSet.Add .

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

Sebbene l'impostazione predefinita sia IncludeDependents (ovvero entità bambini), il comportamento di EF7 di Add() non identifica Venue come figlio di Show . Nel tuo OnModelCreating devi specificare la relazione tra Venue e Show . Vedi Relazioni nei documenti EF7.

Esempio:

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

Tuttavia, anche con questo, sarà comunque necessario chiamare .Add sulle nuove istanze di Venue perché Show non è un dipendente (figlio) di Venue.

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

Vale la pena notare: questo comportamento di .Add () è stato fonte di confusione nell'EF7 RC1 e il suo comportamento potrebbe cambiare in EF7 RC2. Vedi https://github.com/aspnet/EntityFramework/pull/4132


Risposta popolare

Devi aggiornare il tuo modello come questo

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

L'attributo ForegnKey viene utilizzato per definire la chiave foriegn della relazione tra due tabelle




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché