EFcore с IdentityDbContext и заполнением hasData создает IdentityRole - PullRequest
0 голосов
/ 27 ноября 2018

Я немного ослеплен;Я использую dotnet core (2.1) EF с миграциями.Когда я создаю первую миграцию только на основе контекста, на самом деле все выглядит нормально.

поэтому у меня есть такой контекст:

public class DataContext : IdentityDbContext<User, IdentityRole<Guid>, Guid>
{

    public virtual DbSet<Country> Countries { get; set; }
    public virtual DbSet<CountryUser> CountryUsers { get; set; }
    //..more stuff

    public DataContext(DbContextOptions options) : base(options)
    { }
}

, поэтому после создания миграций он хочет добавить:

migrationBuilder.CreateTable(
            name: "AspNetRoles",
            columns: table => new
            {
                Id = table.Column<Guid>(nullable: false),
                Name = table.Column<string>(maxLength: 256, nullable:
                //etc. etc. Removed rest of migrations.

Все хорошо, как я думал.

Тогда я начал следовать следующей статье; Как заполнить пользователя-администратора в EF Core 2.1.0?

После установки HasData и заполнения базы данных, создал новую миграцию, он создал новую миграцию, куда он хотелудалите таблицу AspNetRoles и создайте новую таблицу IdentityRole.Я просто удалил БД и попытался сделать это снова, и теперь он только хочет вставить данные при заполнении.Но я не могу понять, что я изменил и даже лучше, почему он хотел удалить и создать разные таблицы.

Может кто-нибудь объяснить, когда он хочет создать AspNetRoles и когда он хочет создать IdentityRoles (ивдоль других таблиц, которые идут вместе с ним).

Просто чтобы быть уверенным;контекст всегда расширялся от

: IdentityDbContext<User, IdentityRole<Guid>, Guid>

и моего User:

public class User : IdentityUser<Guid>
{
    public virtual ICollection<CountryUser> CountryUsers { get; set; }
}

thnx !!

1 Ответ

0 голосов
/ 27 ноября 2018

Как я понимаю, вы придерживаетесь следующего подхода:

modelBuilder.Entity<IdentityRole>().HasData(new IdentityRole { Name = "Admin", NormalizedName = "Admin".ToUpper() });

Есть две проблемы с этим кодом.

Первая - это использование modelBuilder.Entity<IdentityRole>().Это делает класс IdentityRole обработанным EF Core как сущность , следовательно, таблицу IdentityRoles, которую он пытается создать.Это потому, что IdentityRole класс отличается от того, что использует ваша модель - IdentityRole<Guid>.Измените его на modelBuilder.Entity<IdentityRole<Guid>>() (а также на оператор new), и проблема будет решена.

Вторая проблема заключается в том, что HasData требует указания значений PK, так какобъяснено в разделе Data Seeding документации EF Core:

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

Таким образом, помимо изменения аргумента универсального типа HasData, необходимо предварительно сгенерировать Guid для использования в качестве Id для новой роли (см. Entity Framework Core Auto сгенерированный guid для более подробной информации по аналогичной проблеме) и используйте что-то вроде этого:

modelBuilder.Entity<IdentityRole<Guid>>().HasData(
    new IdentityRole<Guid>
    {
        Id = new Guid("pre generated value"),
        Name = "Admin",
        NormalizedName = "Admin".ToUpper()
    }
);
...