EF Core保存相关数据,多数据关联

本文内容
添加新实体的关系图
添加相关实体
更改关系
删除关系
除了独立实体以外,还可以使用模型中定义的关系。

提示

可在 GitHub 上查看此文章的示例。

添加新实体的关系图
如果创建多个新的相关实体,则将其中一个添加到上下文时也会添加其他实体。

在下面的示例中,博客和三个相关文章会全部插入到数据库中。 由于可通过 Blog.Posts 导航属性访问这些文章,因此可发现并添加它们。

C#

复制
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 实体,因为该实体会添加到已从数据库中提取的 blog 实体的 Posts 属性。

C#

复制
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) 跟踪的实体的导航属性引用的新实体。

C#

复制
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 实体。

C#

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

posted @ 2024-03-29 22:25  一个人走在路上  阅读(21)  评论(0编辑  收藏  举报