EF 7 beta 6: entità con una o più relazioni in EF 7

c# entity-framework entity-framework-core

Domanda

Ho un modello molto semplice:

class Bag
{
    public int Id { get; set; }
    public ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }
}

OnModelCreating del mio contesto (in EF 6 ) è qualcosa del tipo:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Bag>()
        .ToTable("Bag")
        .HasMany(x => x.RandomThings).WithRequired(x => x.Bag).WillCascadeOnDelete();

    modelBuilder.Entity<RandomThing>().ToTable("RandomThing");
}

Per quanto posso dire, non esiste un modo equivalente per farlo. So che le eliminazioni a cascata non sono supportate . Tuttavia, mi stavo chiedendo, qual è il modo migliore per modellare le relazioni da uno a molti come definito nel mio esempio di codice? Sembra che tutto ciò sia andato (o debba ancora essere implementato).

Ho visto un esempio ( qui ) di un DbContext esattamente come voglio, ma in realtà è sbagliato e non funziona. Se provo a tirare giù quel codice sorgente, a configurare il mio ambiente e a fare un salvataggio su un'entità blog con post, quei post non vengono salvati come si potrebbe immaginare.

Ci sono soluzioni alternative per questo?

Risposta accettata

Aggiornamento : questa risposta è stata scritta per EF7 beta7. Le API sono cambiate da allora. Vedi http://docs.efproject.net/en/latest/modeling/relationships.html per le ultime informazioni sull'utilizzo di EF Core.

Risposta originale

In EF 7, è possibile configurare da una a molte relazioni nel metodo OnModelCreating. Perché ciò funzioni, aggiungi una proprietà a RandomThing per rappresentare la chiave di assegnazione e anche un riferimento CLR al tipo genitore.

class Bag
{
    public int Id { get; set; }
    public ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }

    public Bag Bag { get; set; }
    public int BagId { get; set; }
}

Nel tuo contesto, configura la relazione con la seguente configurazione:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{  
    modelBuilder.Entity<RandomThing>()
        .Reference(e => e.Bag)
        .InverseCollection(p => p.RandomThings)
        .ForeignKey(e => e.BagId);
}

Nota a margine : quando EF 7 prevede di aggiungere il supporto per la configurazione di questo tramite attributi.


Risposta popolare

anche se non ho usato affatto l'EF7, in EF6 renderei i tuoi modelli così:

class Bag
{
    public int Id { get; set; }
    public virtual ICollection<RandomThing> RandomThings { get; set; }
}

class RandomThing
{
    public int Id { get; set; }
    public String Description{ get; set; }

    public int BagId {get; set;}
    [ForeignKey("BagId")]
    Public Bag Bag {get; set;}
}

in questo modo la relazione viene gestita con annotazioni di dati e non è necessario il model builder per questa specifica attività



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é