Сохранение связанных данных

В дополнение к изолированным сущностям вы также можете использовать связи, определенные в вашей модели.

Совет

Для этой статьи вы можете скачать пример из репозитория GitHub.

Добавление графа новых сущностей

Если вы создадите несколько новых связанных сущностей, добавление одной из них в контекст приведет к добавлению других.

В следующем примере блог и три связанные записи вставляются в базу данных. Записи обнаруживаются и добавляются, потому что они доступны через свойство навигации 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);
    context.SaveChanges();
}

Совет

Используйте свойство EntityEntry.State, чтобы установить состояние только одной сущности. Например, context.Entry(blog).State = EntityState.Modified.

Если вы ссылаетесь на новую сущность из свойства навигации сущности, которая уже отслеживается контекстом, сущность будет обнаружена и вставлена в базу данных.

В следующем примере вставляется сущность post, так как она добавлена в свойство Posts сущности blog, которая была получена из базы данных.

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

Изменение связей

Если вы измените свойство навигации для сущности, соответствующие изменения будут внесены в столбец внешнего ключа в базе данных.

В следующем примере сущность post обновляется таким образом, чтобы принадлежать к новой сущности blog, потому что ее свойство навигации Blog указывает на blog. Обратите внимание, что blog также будет вставлена в базу данных, так как это новая сущность, на которую ссылается свойство навигации сущности, которая уже отслеживается контекстом (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();
}

Удаление связей

Вы можете удалить связи, установив для свойства навигации по ссылке значение null или удалив связанную сущность из навигации коллекции.

Удаление связи может иметь побочные эффекты для зависимой сущности в соответствии с поведением каскадного удаления, настроенным в связи.

По умолчанию для обязательных связей настроено поведение каскадного удаления, и дочерняя или зависимая сущность будет удалена из базы данных. Для необязательных связей каскадное удаление по умолчанию не настроено, но для свойства внешнего ключа будет установлено значение null.

Дополнительные сведения о настройке обязательных и необязательных связей см. в этом разделе.

Дополнительные сведения о том, как работают реакции каскадного удаления, как они могут быть настроены явно и как они выбираются по соглашению, см. в этой статье.

В следующем примере каскадное удаление настраивается в связи между Blog ​​и Post, поэтому сущность post удаляется из базы данных.

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