関連データの保存Saving Related Data

分離されたエンティティに加え、モデルに定義されたリレーションシップを活用することもできます。In addition to isolated entities, you can also make use of the relationships defined in your model.

ヒント

この記事のサンプルは GitHub で確認できます。You can view this article's sample on GitHub.

新しいエンティティ グループの追加Adding a graph of new entities

関連するいくつかの新しいエンティティを作成しているときに、いずれかのエンティティをコンテキストに追加すると、他のエンティティも同様に追加されます。If you create several new related entities, adding one of them to the context will cause the others to be added too.

次の例では、ブログと 3 つの関連する投稿のすべてがデータベースに挿入されます。In the following example, the blog and three related posts are all inserted into the database. これらの投稿が検出され、追加されるのは、Blog.Posts ナビゲーション プロパティ経由で到達可能であるためです。The posts are found and added, because they are reachable via the Blog.Posts navigation property.

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

ヒント

単一のエンティティの状態を設定するには、EntityEntry.State プロパティを使用します。Use the EntityEntry.State property to set the state of just a single entity. たとえば、context.Entry(blog).State = EntityState.Modified のようにします。For example, context.Entry(blog).State = EntityState.Modified.

コンテキストによって既に追跡されているエンティティのナビゲーション プロパティから新しいエンティティを参照した場合、そのエンティティが検出され、データベースに挿入されます。If you reference a new entity from the navigation property of an entity that is already tracked by the context, the entity will be discovered and inserted into the database.

次の例では、データベースからフェッチされた blog エンティティの Posts プロパティに post エンティティが追加されているため、そのエンティティが挿入されます。In the following example, the post entity is inserted because it is added to the Posts property of the blog entity which was fetched from the database.

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Include(b => b.Posts).First();
    var post = new Post { Title = "Intro to EF Core" };

    blog.Posts.Add(post);
    context.SaveChanges();
}

リレーションシップの変更Changing relationships

エンティティのナビゲーション プロパティを変更すると、データベース内の外部キー列に対応する変更が行われます。If you change the navigation property of an entity, the corresponding changes will be made to the foreign key column in the database.

次の例では、Blog ナビゲーション プロパティが blog をポイントするように設定されているため、post エンティティが新しい blog エンティティに所属するように更新されます。In the following example, the post entity is updated to belong to the new blog entity because its Blog navigation property is set to point to blog. コンテキストによって既に追跡されているエンティティ (post) のナビゲーション プロパティによって参照される新しいエンティティであるため、blog もデータベースに挿入されることに注意してください。Note that blog will also be inserted into the database because it is a new entity that is referenced by the navigation property of an entity that is already tracked by the context (post).

using (var context = new BloggingContext())
{
    var blog = new Blog { Url = "http://blogs.msdn.com/visualstudio" };
    var post = context.Posts.First();

    post.Blog = blog;
    context.SaveChanges();
}

リレーションシップの削除Removing relationships

参照ナビゲーションを null に設定するか、コレクション ナビゲーションから関連エンティティを削除することで、リレーションシップを削除できます。You can remove a relationship by setting a reference navigation to null, or removing the related entity from a collection navigation.

リレーションシップの削除は、リレーションシップに構成された連鎖削除動作に従って、依存エンティティに影響を与える可能性があります。Removing a relationship can have side effects on the dependent entity, according to the cascade delete behavior configured in the relationship.

必須リレーションシップでは、連鎖削除動作が既定で構成され、子/依存エンティティがデータベースから削除されます。By default, for required relationships, a cascade delete behavior is configured and the child/dependent entity will be deleted from the database. 省略可能なリレーションシップでは、連鎖削除は既定では構成されていませんが、外部キー プロパティが null 設定されます。For optional relationships, cascade delete is not configured by default, but the foreign key property will be set to null.

リレーションシップが必須かどうかを構成する方法については、「Required and Optional Relationships」(必須リレーションシップと省略可能なリレーションシップ) を参照してください。See Required and Optional Relationships to learn about how the requiredness of relationships can be configured.

連鎖削除の動作方法、それらを明示的に構成する方法、および慣例に従った選択方法については、「連鎖削除」を参照してください。See Cascade Delete for more details on how cascade delete behaviors work, how they can be configured explicitly and how they are selected by convention.

次の例では、BlogPost 間のリレーションシップに連鎖削除が構成されているため、post エンティティがデータベースから削除されます。In the following example, a cascade delete is configured on the relationship between Blog and Post, so the post entity is deleted from the database.

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Include(b => b.Posts).First();
    var post = blog.Posts.First();

    blog.Posts.Remove(post);
    context.SaveChanges();
}