Compartilhar via


Salvando dados relacionados

Além de entidades isoladas, você também pode usar as relações definidas em seu modelo.

Dica

Você pode exibir o exemplo deste artigo no GitHub.

Adicionando um grafo de novas entidades

Se você criar várias entidades relacionadas, adicionar uma delas ao contexto fará com que as outras também sejam adicionadas.

No exemplo a seguir, o blog e três postagens relacionadas são inseridos no banco de dados. As postagens são encontradas e adicionadas, pois são acessíveis por meio da Blog.Posts propriedade de navegação.

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

Dica

Use a propriedade EntityEntry.State para definir o estado de apenas uma única entidade. Por exemplo, context.Entry(blog).State = EntityState.Modified.

Se você fizer referência a uma nova entidade a partir da propriedade de navegação de uma entidade que já está sendo rastreada pelo contexto, a entidade será identificada e inserida no banco de dados.

No exemplo a seguir, a entidade post é inserida porque foi adicionada à propriedade Posts da entidade blog, que foi buscada do banco de dados.

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

Alterando relações

Se você alterar a propriedade de navegação de uma entidade, as alterações correspondentes serão feitas na coluna de chave estrangeira no banco de dados.

No exemplo a seguir, a post entidade é atualizada para pertencer à nova blog entidade porque sua Blog propriedade de navegação está definida para apontar para blog. Observe que blog também será inserido no banco de dados porque é uma nova entidade referenciada pela propriedade de navegação de uma entidade que já está acompanhada pelo contexto (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();
}

Removendo relações

Você pode remover uma relação definindo uma navegação de referência para null, ou removendo a entidade relacionada de uma navegação de coleção.

A remoção de uma relação pode ter efeitos colaterais na entidade dependente, de acordo com o comportamento de exclusão em cascata configurado na relação.

Por padrão, para as relações necessárias, um comportamento de exclusão em cascata é configurado e a entidade filho/dependente será excluída do banco de dados. Para relações opcionais, a exclusão em cascata não é configurada por padrão, mas a propriedade de chave estrangeira será definida como nula.

Consulte Relações Obrigatórias e Opcionais para saber mais sobre como a necessidade de relações pode ser configurada.

Consulte Cascade Delete para obter mais detalhes sobre como funcionam os comportamentos de exclusão em cascata, como eles podem ser configurados explicitamente e como eles são selecionados por convenção.

No exemplo a seguir, uma exclusão em cascata é configurada na relação entre Blog e Post, portanto, a post entidade é excluída do banco de dados.

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