首页 文章

使用Entity Framework Core以多对多关系为数据库播种

提问于
浏览
1

我使用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 回答

  • 3

    如果我将DbSet BlogPosts添加到DbContext中,即使他们在示例中没有这样做,它会不会有任何损害?

    不可以 . 显式连接实体( BlogPost )与任何其他实体一样,因此您可以为其添加(或不添加) DbSet .

    如果我没有将DbSet添加到DbContext,那么创建博客然后在为数据库播种时添加多个帖子的正确方法是什么 . 关于下面的事情似乎很奇怪 . 我更喜欢简单地创建BlogPost对象并将它们添加到上下文中的BlogPosts .

    即使您没有公开 DbSet<T> 属性,也可以始终使用 Set<T> 方法来访问相应的 DbSet<T>

    context.Set<BlogPost>().Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
    

    或直接使用 DbContextAdd 方法:

    context.Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
    

    此外,如果我只关心从单一方向查询它们,我是否必须像在示例中一样向Blog和Post添加List导航属性 . 即博客>帖子,不需要发布博客 .

    导航属性不是必需的 - 请参阅Single Navigation Property EF Core文档主题 . 你可以省略其中任何一个 . 您甚至不需要为关系配置流畅的配置,因为一切都符合惯例 . 但是如果您使用如示例中的流畅配置,请确保使用 WithMany() 方法而不传递lambda / string导航属性(因为您没有它) .

  • 1

    如果我将DbSet BlogPosts添加到DbContext中,即使他们在示例中没有这样做,它会不会有任何损害?

    没有!它不会受伤!这样做没有问题!那么你可以使用如下:

    context.BlogPosts.Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
    

    如果我没有将DbSet添加到DbContext,那么创建博客然后在为数据库播种时添加多个帖子的正确方法是什么 .

    如果您不想将 BlogPosts 公开为 DbSet<> ,那么您可以执行以下操作:

    context.Set<BlogPost>().Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
    

    如果我只关心从单一方向查询它们,我必须像在示例中一样向Blog和Post添加List导航属性 . 即博客>帖子,不需要发布博客 .

    没有!它不是强制性的 . 你可以这样做:

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
    
    }
    
    public class Tag
    {
        public string TagId { get; set; }
    }
    
    public class PostTag
    {
        public int PostId { get; set; }
        public Post Post { get; set; }
    
        public string TagId { get; set; }
        public Tag Tag { get; set; }
    }
    

    然后在DbContext中:

    class MyContext : DbContext
    {
        public DbSet<Post> Posts { get; set; }
        public DbSet<Tag> Tags { get; set; }
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PostTag>()
                .HasKey(t => new { t.PostId, t.TagId });
    
            modelBuilder.Entity<PostTag>()
                .HasOne(pt => pt.Post)
                .WithMany()
                .HasForeignKey(pt => pt.PostId);
    
            modelBuilder.Entity<PostTag>()
                .HasOne(pt => pt.Tag)
                .WithMany()
                .HasForeignKey(pt => pt.TagId);
        }
    }
    

相关问题