我使用this example创建了与Entity Framework Core的多对多关系,但有一些问题:
如果我将DbSet BlogPosts添加到DbContext中,即使他们在示例中没有这样做,它会不会有任何损害?
如果我没有将DbSet添加到DbContext,那么创建Blog然后在为数据库播种时添加多个帖子的正确方法是什么 . 关于下面的事情似乎很奇怪 . 我更喜欢简单地创建BlogPost对象并将它们添加到上下文中的BlogPosts .
var blog1 = new Blog() { Name = "ABC" };
blog1.BlogPosts.Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
var blog2 = new Blog() { Name = "123" };
blog2.BlogPosts.Add(new BlogPost { BlogId = blog2.Id, PostId = post1.Id });
var blog3 = new Blog() { Name = "XYZ" };
blog3.BlogPosts.Add(new BlogPost { BlogId = blog3.Id, PostId = post2.Id });
dbContext.SaveChanges();
此外,如果我只关心从单一方向查询它们,我是否必须像在示例中一样向Blog和Post添加List导航属性 . 即博客>帖子,不需要发布博客 .
2 回答
不可以 . 显式连接实体(
BlogPost
)与任何其他实体一样,因此您可以为其添加(或不添加)DbSet
.即使您没有公开
DbSet<T>
属性,也可以始终使用Set<T>
方法来访问相应的DbSet<T>
:或直接使用
DbContext
的Add
方法:导航属性不是必需的 - 请参阅Single Navigation Property EF Core文档主题 . 你可以省略其中任何一个 . 您甚至不需要为关系配置流畅的配置,因为一切都符合惯例 . 但是如果您使用如示例中的流畅配置,请确保使用
WithMany()
方法而不传递lambda / string导航属性(因为您没有它) .没有!它不会受伤!这样做没有问题!那么你可以使用如下:
如果您不想将
BlogPosts
公开为DbSet<>
,那么您可以执行以下操作:没有!它不是强制性的 . 你可以这样做:
然后在DbContext中: