Estoy tratando de entender esta oración:
Por defecto, para las relaciones requeridas, se configura un comportamiento de eliminación en cascada y la entidad dependiente / dependiente se eliminará de la base de datos.
que se encuentra en el párrafo "Eliminar relaciones" en esta documentación de Microsoft de EF Core: https://docs.microsoft.com/en-us/ef/core/saving/related-data#removing-relationships
En una API .Net Core, con un modelo de blog y publicaciones de la siguiente manera
public class Blog
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int BlogId { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public class Post
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PostId { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
Cuando recupero un blog por id a través de
[HttpGet("{id}")]
public async Task<IActionResult> GetBlog([FromRoute] int id)
{
return await context.Blog.Where(b => b.BlogId == id)
.Include(b => b.Posts).FirstOrDefaultAsync();
}
Recibo en JSON
{
"BlogId": 1,
"Posts": [
{
"PostId": 1
},
{
"PostId": 2
}
]
}
Cuando devuelvo a la API, el JSON actualizado siguiente se conservará en la base de datos
{
"BlogId": 1,
"Posts": [
{
"PostId": 2
}
]
}
a
[HttpPut("{id}")]
public async Task<IActionResult> PutBlog([FromRoute] int id, [FromBody] Blog blog)
{
this.context.Update(blog);
await this.context.SaveChangesAsync();
return this.Ok();
}
Todo funciona bien pero no se modifican las entradas.
Como se requiere la relación de una publicación a un blog y la publicación relacionada se elimina de la propiedad de colección de publicaciones del blog, ¿no debería eliminarse la publicación con PostId = 1 de la base de datos?
Lo que realmente me confunde es que, tan pronto como uso una relación de muchos a muchos entre blogs y publicaciones, sin cambiar nada más en la lógica, la entrada en la tabla Blog_Post donde PostId = 1 se elimina realmente.
Enity Framework elimina entidades relacionadas de la entidad principal a la entidad dependiente. En su caso, el principio es el blog y la publicación es la entidad dependiente. Al eliminar blogs, las publicaciones relacionadas también se deben eliminar. También debe decorar con el atributo de clave externa, su clase en ese caso se verá así.
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogForeignKey { get; set; }
[ForeignKey("BlogForeignKey")]
public Blog Blog { get; set; }
}
También debe definir el comportamiento de eliminación, puede hacerlo utilizando la configuración de API Fluent, Cascade eliminará la entidad relacionada, si no desea eliminar la entidad relacionada, use ClientSetNull, lo hará
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
.HasForeignKey(p => p. BlogForeignKey)
.OnDelete(DeleteBehavior.Cascade);