分離されたエンティティに加えて、モデルで定義されているリレーションシップを利用することもできます。
ヒント
この記事の サンプル は、GitHub で確認できます。
新しいエンティティのグラフの追加
複数の新しい関連エンティティを作成した場合、そのうちの 1 つをコンテキストに追加すると、他のエンティティも追加されます。
次の例では、ブログと 3 つの関連する投稿がすべてデータベースに挿入されます。 投稿は、 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);
await context.SaveChangesAsync();
}
ヒント
EntityEntry.State プロパティを使用して、単一のエンティティの状態を設定します。 たとえば、context.Entry(blog).State = EntityState.Modified
のようにします。
関連エンティティの追加
コンテキストによって既に追跡されているエンティティのナビゲーション プロパティから新しいエンティティを参照すると、エンティティが検出され、データベースに挿入されます。
次の例では、データベースからフェッチされたpost
エンティティのPosts
プロパティに追加されるため、blog
エンティティが挿入されます。
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();
}
リレーションシップの変更
エンティティのナビゲーション プロパティを変更すると、対応する変更がデータベースの外部キー列に加えられます。
次の例では、post
ナビゲーション プロパティが blog
を指すように設定されているため、Blog
エンティティが新しいblog
エンティティに属するように更新されます。
blog
は、コンテキスト (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();
}
リレーションシップの削除
リレーションシップを削除するには、参照ナビゲーションを null
に設定するか、関連エンティティをコレクション ナビゲーションから削除します。
リレーションシップで構成されている連鎖削除動作に従って、リレーションシップを削除すると、依存エンティティに副作用が及びます。
既定では、必要なリレーションシップに対して連鎖削除動作が構成され、子/依存エンティティがデータベースから削除されます。 省略可能なリレーションシップの場合、連鎖削除は既定では構成されませんが、外部キー プロパティは null に設定されます。
リレーションシップの必須性を構成する方法については、「 必須リレーションシップと省略可能 なリレーションシップ」を参照してください。
連鎖削除の動作のしくみ、明示的に構成する方法、規則で選択する方法の詳細については、「連鎖削除」を参照してください。
次の例では、 Blog
と Post
の間のリレーションシップに対して連鎖削除が構成されているため、 post
エンティティはデータベースから削除されます。
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();
}
.NET