[英]Seeding the database with a many-to-many relationship using Entity Framework Core
我使用此示例与Entity Framework Core建立了多对多关系,但有几个问题:
即使我在示例中没有将DbSet BlogPosts添加到DbContext,也会对它造成任何伤害吗?
如果我不将DbSet添加到DbContext,那么在创建数据库时,创建博客然后在其中添加多个帖子的正确方法是什么。 以下内容似乎很奇怪。 我希望仅创建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导航属性。 即博客>帖子,不需要发布博客。
即使我在示例中没有将DbSet BlogPosts添加到DbContext,也会对它造成任何伤害吗?
否。显式连接实体( BlogPost
)与其他实体一样,因此可以DbSet
添加(或不添加) DbSet
。
如果我不将DbSet添加到DbContext,那么在创建数据库时,创建博客然后在其中添加多个帖子的正确方法是什么。 以下内容似乎很奇怪。 我希望仅创建BlogPost对象并将它们添加到上下文中的BlogPosts中。
即使您没有公开DbSet<T>
属性,也可以始终使用Set<T>
方法来访问相应的DbSet<T>
:
context.Set<BlogPost>().Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
或直接使用DbContext
的Add
方法:
context.Add(new BlogPost { BlogId = blog1.Id, PostId = post1.Id });
另外,如果仅考虑从一个方向查询它们,是否必须像在示例中一样向Blog和Post添加List导航属性。 即博客>帖子,不需要发布博客。
导航属性不是必需的-请参阅“ 单个导航属性 EF核心”文档主题。 您可以忽略其中任何一个。 您甚至不需要流利的关系配置,因为一切都是按照惯例进行的。 但是,如果您如示例中那样使用流畅的配置,请确保在不传递lambda / string导航属性的情况下使用WithMany()
方法(因为您没有此属性)。
即使我在示例中没有将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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.