次の方法で共有


関連データの保存

分離されたエンティティに加えて、モデルで定義されているリレーションシップを利用することもできます。

ヒント

この記事の サンプル は、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 に設定されます。

リレーションシップの必須性を構成する方法については、「 必須リレーションシップと省略可能 なリレーションシップ」を参照してください。

連鎖削除の動作のしくみ、明示的に構成する方法、規則で選択する方法の詳細については、「連鎖削除」を参照してください。

次の例では、 BlogPostの間のリレーションシップに対して連鎖削除が構成されているため、 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();
}