簡體   English   中英

使用Entity Framework Core以多對多關系為數據庫播種

[英]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 });

或直接使用DbContextAdd方法:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM