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 grafo delle nuove entità

Se si creano varie nuove entità correlate, l'aggiunta di una di esse al contesto comporterà l'aggiunta anche delle altre.

Nell'esempio seguente il blog e i tre post correlati vengono tutti inseriti nel database. I post vengono rilevati e aggiunti, in quanto 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);
    context.SaveChanges();
}

Suggerimento

Usare la proprietà EntityEntry.State per impostare lo stato di una singola 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à inclusa nel rilevamento delle modifiche dal contesto, l'entità verrà individuata e inserita nel database.

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

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

    blog.Posts.Add(post);
    context.SaveChanges();
}

Modifica delle relazioni

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

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

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

    post.Blog = blog;
    context.SaveChanges();
}

Rimozione delle relazioni

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

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

Per impostazione predefinita, per le relazioni obbligatorie 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 viene configurata per impostazione predefinita, ma la proprietà di chiave esterna verrà impostata su Null.

Vedere Relazioni obbligatorie e facoltative per informazioni su come configurare l'obbligatorietà delle relazioni.

Vedere Eliminazione a catena per altri dettagli su come funzionano i comportamenti di eliminazione, su come è possibile configurarli in modo esplicito e sulla modalità di selezione convenzionale.

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

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

    blog.Posts.Remove(post);
    context.SaveChanges();
}