Создание и заполнение отношения многих ко многим в asp. net core 3 - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу построить проект с asp. net ядром 3.1, и я хочу установить отношение «многие ко многим» между пользователем с другой личностью и другой таблицей (книгой), у меня есть 2 таблицы: AspNetUsers (ApplicationUser) и book:

public class ApplicationUser : IdentityUser // It's identity user
{
    ...

    public ICollection<UserBooks> UserBooks { get; set; }
}

Book:

public class Book
{
    [Required]
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<UserBooks> UserBooks { get; set; }
}

UserBooks для связи:

public class UserBooks
{
    public string UserId { get; set; }

    public ApplicationUser User { get; set; }

    public int BookId { get; set; }

    public Book Book { get; set; }
}

Теперь я хочу создать базу данных и создать данные инициализации (пользователи и книги) :

Пользователь:

  • Электронная почта: user1@test.com> У этого пользователя должно быть 2 книги
  • Электронная почта: user2@test.com> у этого пользователя должна быть книга 1

Книга:

  • Id: 1, Name : "B1"> Эта книга должна иметь 2 пользователей

  • Id: 2, Имя: "B2"> Эта книга должна иметь пользователя 1

Есть некоторые темы о посеве, но я не знаю, как посеять другую таблицу и пользовательскую таблицу идентификаторов с отношением ко многим

Как мне seed Пользователи и книги и пользовательские книги ??

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я создаю ApplicationDbInitializer класс и вызываю его из startup.cs

ApplicationDbInitializer.Seed(userManager, roleManager, context);

ApplicationDbInitializer:

public static class ApplicationDbInitializer
{
    public static void Seed(
        UserManager<ApplicationUser> userManager,
        RoleManager<IdentityRole> roleManager,
        ApplicationDbContext context)
    {
        var roleName = "admin";

        roleManager.CreateAsync(new IdentityRole
        {
            Name = roleName,
            NormalizedName = roleName.ToUpper()
        }).Wait();

        if (userManager.FindByEmailAsync("b@b.com").Result == null)
        {
            var user = new ApplicationUser
            {
                UserName = "b@b.com",
                Email = "b@b.com"
            };

            if (userManager.CreateAsync(user, "@Aa123456").Result.Succeeded)
                userManager.AddToRoleAsync(user, roleName).Wait();
        }

        context.SaveChanges();

        context.Books.AddRange(
            new List<Book> {
                new Book{ Name="B1" },
                new Book{ Name="B2" },
            });

        context.SaveChanges();

        var userIdOfB = context.Users.FirstOrDefault(u => u.Email == "b@b.com").Id;
        var bookId1 = context.Books.FirstOrDefault(c => c.Name == "B1").Id;
        var bookId2 = context.Books.FirstOrDefault(c => c.Name == "B2").Id;

        context.UserBooks.AddRange(new List<UserBooks>
        {
            new UserBooks{ BookId = bookId1 , UserId = userIdOfB },
            new UserBooks{ BookId = bookId2 , UserId = userIdOfB }
        });

        context.SaveChanges();
    }
}

Работает, все данные сохраняются в БД и UserBooks таблица создана с отношениями, но когда я хочу получить UserBooks, она пуста:

var res = _context.Users.FirstOrDefault(u => u.Email == "b@b.com").UserBooks;

Кто-нибудь может мне помочь, plzzz Почему res пуст? ??

0 голосов
/ 21 апреля 2020

Сначала заполните Книги и Пользователей нужными вам данными. (Если вы хотите, чтобы их было много для тестирования, вы можете использовать GO 25000 после вставки, и он будет запускаться 25000 раз). Затем заполните UserBooks. Вы можете сделать это вручную, если вам нужно указать c отношения, или случайным образом в WHILE l oop, получив случайные идентификаторы для обоих полей в диапазоне идентификаторов Книг и Пользователей. Вы также можете использовать GO <> после скрипта, и он будет запускать его много раз.

...