Заполнение базы данных отношениями «многие ко многим» с использованием Entity Framework Core - PullRequest
0 голосов
/ 11 декабря 2018

Я создал отношение многие-ко-многим с 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();

Кроме того, обязательно ли добавлять свойство навигации по списку в блог и публикацию, как в примере, если ябудет заботиться только о том, чтобы запрашивать их с одного направления.т.е. Блог> Сообщения, не нуждаются в блогах.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Не повредит ли что-нибудь, если я добавлю 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 });

или напрямую использовать Add метод DbContext:

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

Кроме того, обязательно ли добавлятьПеречислите свойство навигации по списку для блога и поста, как в примере, если я буду заботиться о том, чтобы запрашивать их только в одном направлении.т. е. Блог> Сообщения, не нуждающиеся в блогах.

Свойства навигации не являются обязательными - см. Одиночное свойство навигации Тема документации EF Core.Вы можете опустить любой из них.Вам даже не нужна свободная конфигурация для отношений, потому что все по соглашению.Но в случае, если вы используете свободную конфигурацию, как в примере, убедитесь, что вы используете метод WithMany(), не передавая лямбда / строковое свойство навигации (потому что у вас его нет).

0 голосов
/ 11 декабря 2018

Не повредит ли что-нибудь, если я добавлю 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 });

обязательно ли ядобавьте свойство навигации по списку в блог и публикацию, как в примере, если я буду заботиться о том, чтобы запрашивать их только в одном направлении.т.е. Блог> Сообщения, не нуждаются в блогах.

Нет!это не обязательно.Вы можете сделать следующее:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...