Condividi tramite


Salvataggio di dati correlati

Oltre alle entità isolate, è anche possibile usare le relazioni definite nel modello.

Suggerimento

È possibile visualizzare l'esempio di questo articolo in GitHub.

Aggiunta di un grafico di nuove entità

Se si creano diverse nuove entità correlate, l'aggiunta di una di esse al contesto causerà anche l'aggiunta di altre entità.

Nell'esempio seguente, il blog e tre post correlati vengono tutti inseriti nel database. I post vengono trovati e aggiunti, perché sono raggiungibili tramite la proprietà di navigazione Blog.Posts.

using (var context = new BloggingContext())
{
    var blog = new Blog
    {
        Url = "http://blogs.msdn.com/dotnet",
        Posts = new List<Post>
        {
            new Post { Title = "Intro to C#" },
            new Post { Title = "Intro to VB.NET" },
            new Post { Title = "Intro to F#" }
        }
    };

    context.Blogs.Add(blog);
    await context.SaveChangesAsync();
}

Suggerimento

Utilizzare la proprietà EntityEntry.State per impostare lo stato di una sola entità. Ad esempio: context.Entry(blog).State = EntityState.Modified.

Se si fa riferimento a una nuova entità dalla proprietà di navigazione di un'entità già rilevata dal contesto, l'entità verrà individuata e inserita nel database.

Nell'esempio seguente l'entità post viene inserita perché viene aggiunta alla Posts proprietà dell'entità blog recuperata dal database.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.Include(b => b.Posts).FirstAsync();
    var post = new Post { Title = "Intro to EF Core" };

    blog.Posts.Add(post);
    await context.SaveChangesAsync();
}

Modifica delle relazioni

Se si modifica la proprietà di navigazione di un'entità, le modifiche corrispondenti verranno apportate alla colonna chiave esterna nel database.

Nell'esempio seguente l'entità post viene aggiornata in modo che appartenga alla nuova blog entità perché la relativa Blog proprietà di navigazione è impostata in modo che punti a blog. Si noti che blog verrà inserito anche nel database perché è una nuova entità a cui fa riferimento la proprietà di navigazione di un'entità già rilevata dal contesto (post).

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
    var post = await context.Posts.FirstAsync();

    post.Blog = blog;
    await context.SaveChangesAsync();
}

Rimozione di relazioni

È possibile rimuovere una relazione impostando una navigazione di riferimento su null, oppure rimuovendo l'entità correlata da una navigazione della raccolta.

La rimozione di una relazione può avere effetti collaterali sull'entità dipendente, in base al comportamento di eliminazione a catena configurato nella relazione.

Per impostazione predefinita, per le relazioni necessarie, viene configurato un comportamento di eliminazione a catena e l'entità figlio/dipendente verrà eliminata dal database. Per le relazioni facoltative, l'eliminazione a catena non è configurata per impostazione predefinita, ma la proprietà della chiave esterna verrà impostata su Null.

Per imparare come configurare l'obbligatorietà delle relazioni, consultare Relazioni obbligatorie e facoltative.

Per altre informazioni sul funzionamento dei comportamenti di eliminazione a catena, vedere Eliminazione a catena , come possono essere configurati in modo esplicito e su come vengono selezionati per convenzione.

Nell'esempio seguente viene configurata un'eliminazione a catena nella relazione tra Blog e Post, quindi l'entità post viene eliminata dal database.

using (var context = new BloggingContext())
{
    var blog = await context.Blogs.Include(b => b.Posts).FirstAsync();
    var post = blog.Posts.First();

    blog.Posts.Remove(post);
    await context.SaveChangesAsync();
}