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