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

时间:2018-12-11 14:10:38

标签: c# entity-framework asp.net-core entity-framework-core

我使用this example与Entity Framework Core建立了多对多关系,但有几个问题:

即使我在示例中没有将DbSet BlogPosts添加到DbContext,也会对我有什么伤害?

如果我不将DbSet添加到DbContext,那么在创建数据库时,将是创建Blog并向其中添加多个Posts的正确方法。以下内容似乎很奇怪。我希望仅创建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导航属性。即Blog>帖子,不需要Post Blog。

2 个答案:

答案 0 :(得分:3)

  

即使我在示例中没有将DbSet BlogPosts添加到DbContext,也会对我有什么伤害?

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

  

如果我不将DbSet添加到DbContext,那么在创建数据库时,将是创建Blog并向其中添加多个Posts的正确方法。以下内容似乎很奇怪。我希望仅创建BlogPost对象并将它们添加到上下文中的BlogPosts中。

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

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

或直接使用Add的{​​{1}}方法:

DbContext
  

此外,如果仅考虑从一个方向查询它们,是否必须像在示例中一样向Blog和Post添加一个List导航属性。即Blog>帖子,不需要Post Blog。

导航属性不是必需的-请参阅Single Navigation Property EF Core文档主题。您可以忽略其中任何一个。您甚至不需要流利的关系配置,因为一切都是按照惯例进行的。但是,如果您如示例中那样使用流畅的配置,请确保使用context.Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id }); 方法而不传递lambda / string导航属性(因为您没有此属性)。

答案 1 :(得分: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 });
  如果我只想从一个方向查询它们,那么像在示例中一样,必须将List导航属性同时添加到Blog和Post中,这是强制性的。即Blog>帖子,不需要Post Blog。

不!它不是强制性的。您可以执行以下操作:

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