私はこの文を理解しようとしています:
デフォルトでは、必要な関係について、カスケード削除動作が設定され、子/依存エンティティがデータベースから削除されます。
EF CoreのこのMicrosoftドキュメントの「関係の削除」段落にあります: https : //docs.microsoft.com/en-us/ef/core/saving/related-data#removing-relationships
.Net Core APIで、次のようなブログと投稿のモデル
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; }
}
IDでブログを取得するとき
[HttpGet("{id}")]
public async Task<IActionResult> GetBlog([FromRoute] int id)
{
return await context.Blog.Where(b => b.BlogId == id)
.Include(b => b.Posts).FirstOrDefaultAsync();
}
JSONで受け取ります
{
"BlogId": 1,
"Posts": [
{
"PostId": 1
},
{
"PostId": 2
}
]
}
APIに返信すると、更新された次のJSONがデータベースに保持されます
{
"BlogId": 1,
"Posts": [
{
"PostId": 2
}
]
}
に
[HttpPut("{id}")]
public async Task<IActionResult> PutBlog([FromRoute] int id, [FromBody] Blog blog)
{
this.context.Update(blog);
await this.context.SaveChangesAsync();
return this.Ok();
}
すべて正常に動作しますが、エントリは変更されません。
投稿からブログへの関係が必要であり、関連する投稿がブログのコレクションの投稿プロパティから削除されるため、PostId = 1の投稿はデータベースから削除されませんか?
本当に混乱するのは、ブログと投稿の間に多対多の関係を使用し、ロジックの他の部分を変更しないとすぐに、PostId = 1のテーブルBlog_Postのエントリが実際に削除されることです。
Enity Frameworkは、関連するエンティティをプリンシパルエンティティから依存エンティティに削除します。あなたの場合、原則はブログであり、投稿は依存エンティティです。ブログを削除すると、投稿も削除されます。また、外部キー属性で装飾する必要があります。その場合のクラスは次のようになります。
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; }
}
また、削除動作を定義する必要があります。FluentAPI設定を使用してこれを行うことができます。カスケードは関連エンティティを削除します。関連エンティティを削除したくない場合はClientSetNullを使用します。
model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts)
.HasForeignKey(p => p. BlogForeignKey)
.OnDelete(DeleteBehavior.Cascade);