Compartir a través de


Guardar datos relacionados

Además de las entidades aisladas, también puede usar las relaciones definidas en el modelo.

Sugerencia

Puede ver un ejemplo de este artículo en GitHub.

Adición de un gráfico de nuevas entidades

Si crea varias entidades relacionadas, agregar una de ellas al contexto hará que los demás también se agreguen.

En el ejemplo siguiente, el blog y tres entradas relacionadas se insertan en la base de datos. Ya que son accesibles a través de la propiedad de Blog.Posts navegación, las publicaciones se encuentran y agregan.

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

Sugerencia

Use la propiedad EntityEntry.State para establecer el estado de una sola entidad. Por ejemplo: context.Entry(blog).State = EntityState.Modified.

Si hace referencia a una nueva entidad a través de la propiedad de navegación de una entidad que el contexto ya está siguiendo, la entidad se detectará e insertará en la base de datos.

En el ejemplo siguiente, la entidad post se inserta porque se agrega a la propiedad Posts de la entidad blog que se recuperó de la base de datos.

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

Cambio de relaciones

Si cambia la propiedad de navegación de una entidad, los cambios correspondientes se realizarán en la columna de clave externa de la base de datos.

En el ejemplo siguiente, la post entidad se actualiza para que pertenezca a la nueva blog entidad porque su Blog propiedad de navegación está establecida para que apunte a blog. Tenga en cuenta que blog también se insertará en la base de datos porque es una nueva entidad a la que hace referencia la propiedad de navegación de una entidad que ya está siendo rastreada por el 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();
}

Quitar relaciones

Puede quitar una relación estableciendo una navegación de referencia en nullo quitando la entidad relacionada de una navegación de colección.

Quitar una relación puede tener efectos secundarios en la entidad dependiente, según el comportamiento de eliminación en cascada configurado en la relación.

De forma predeterminada, para las relaciones necesarias, se configura un comportamiento de eliminación en cascada y la entidad secundaria o dependiente se eliminará de la base de datos. Para las relaciones opcionales, la eliminación en cascada no está configurada de forma predeterminada, pero la propiedad de clave externa se establecerá en NULL.

Consulte Relaciones obligatorias y opcionales para obtener información sobre cómo se puede configurar la obligatoriedad de las relaciones.

Consulte Eliminación en cascada para obtener más información sobre cómo funcionan los comportamientos de eliminación en cascada, cómo se pueden configurar explícitamente y cómo se seleccionan por convención.

En el ejemplo siguiente, se configura una eliminación en cascada en la relación entre Blog y Post, por lo que la post entidad se elimina de la base de datos.

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