Entity Framework Seeding with Identity (Microsoft.Owin.Security) пользователь

asp.net-identity asp.net-mvc entity-framework entity-framework-6

Вопрос

У меня есть класс, который засевает базу данных, которая добавляет 2 пользователя с ролями и настраиваемыми полями. Проблема заключается в том, что она сохраняет данные в [dbo]. [AspNetUsers] вместо [dbo]. [IdentityUsers]. Создаются обе таблицы. При посеве данные поступают в AspNetUser. Когда я запускаю веб-сайт и регистрирую нового пользователя, данные переходят в IdentityUser.

Вот класс миграции:

internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DatabaseContext context)
    {
        base.Seed(context);

        var userStore = new UserStore<ApplicationUser>();
        var manager = new UserManager<ApplicationUser>(userStore);

        var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) };
        var user = new ApplicationUser() { UserName = "123123", Email = "123123@123.com", Language = "en-US"};
        user.Roles.Add(role);
        IdentityResult result = manager.Create(user, "123123");

        var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.NORMAL) };
        var user2 = new ApplicationUser() { UserName = "qweqwe", Email = "qweqwe@qweqwe.com", Language = "fr-CA" };
        user.Roles.Add(role2);
        IdentityResult result2 = manager.Create(user2, "qweqwe");
    }
}

Вот класс ApplicationUser, который определяет настраиваемое поле для модели Identity.

internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DatabaseContext context)
    {
        base.Seed(context);

        var userStore = new UserStore<ApplicationUser>();
        var manager = new UserManager<ApplicationUser>(userStore);

        var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) };
        var user = new ApplicationUser() { UserName = "123123", Email = "123123@123.com", Language = "en-US"};
        user.Roles.Add(role);
        IdentityResult result = manager.Create(user, "123123");

        var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.NORMAL) };
        var user2 = new ApplicationUser() { UserName = "qweqwe", Email = "qweqwe@qweqwe.com", Language = "fr-CA" };
        user.Roles.Add(role2);
        IdentityResult result2 = manager.Create(user2, "qweqwe");
    }
}

Вот класс конфигурации Entity Framework для этого нового класса.

internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DatabaseContext context)
    {
        base.Seed(context);

        var userStore = new UserStore<ApplicationUser>();
        var manager = new UserManager<ApplicationUser>(userStore);

        var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) };
        var user = new ApplicationUser() { UserName = "123123", Email = "123123@123.com", Language = "en-US"};
        user.Roles.Add(role);
        IdentityResult result = manager.Create(user, "123123");

        var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.NORMAL) };
        var user2 = new ApplicationUser() { UserName = "qweqwe", Email = "qweqwe@qweqwe.com", Language = "fr-CA" };
        user.Roles.Add(role2);
        IdentityResult result2 = manager.Create(user2, "qweqwe");
    }
}

введите описание изображения здесь

Оба используют сохранение DataContext с той же конфигурацией:

internal sealed class Configuration : DbMigrationsConfiguration<DatabaseContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DatabaseContext context)
    {
        base.Seed(context);

        var userStore = new UserStore<ApplicationUser>();
        var manager = new UserManager<ApplicationUser>(userStore);

        var role = new IdentityUserRole { Role = new IdentityRole(Model.Roles.ADMINISTRATOR) };
        var user = new ApplicationUser() { UserName = "123123", Email = "123123@123.com", Language = "en-US"};
        user.Roles.Add(role);
        IdentityResult result = manager.Create(user, "123123");

        var role2 = new IdentityUserRole { Role = new IdentityRole(Model.Roles.NORMAL) };
        var user2 = new ApplicationUser() { UserName = "qweqwe", Email = "qweqwe@qweqwe.com", Language = "fr-CA" };
        user.Roles.Add(role2);
        IdentityResult result2 = manager.Create(user2, "qweqwe");
    }
}

Мой вопрос: почему у меня есть имя таблицы префиксов AspNet, которое дублируется из таблиц Identity? Почему семена используют одно, а веб-приложение использует другое?

Принятый ответ

Является ли ваш DbContext унаследованным от IdentityDbContext?

Если вы наследуете IdentityDbContext, вам не нужна никакая дополнительная конфигурация в OnModelCreating. Соответствия, предоставляемые IdentityDbContext и стандартными соглашениями Entity Framework, должны быть достаточными.

Если вы объявите свой ApplicationUser без установщика для UserId, вам не нужно будет игнорировать свойство UserId:

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        Email = "";
        Language = "";
    }

    public string Email { get; set; }
    public string Language { get; set; }

    public string UserId
    {
        get { return Id; }
    }
}

Тогда ваш ApplicationDbContext может быть таким же простым, как это (ясленно переименовал свой класс конфигурации в MigrationConfiguration):

public class ApplicationUser : IdentityUser
{
    public ApplicationUser()
    {
        Email = "";
        Language = "";
    }

    public string Email { get; set; }
    public string Language { get; set; }

    public string UserId
    {
        get { return Id; }
    }
}

Это работает как ожидалось (только таблицы с именем AspNetXXXX, таблица AspNetUsers имеют настраиваемые поля) с версиями выпуска (версия 1.0.0) сборников AspNet.Identity.Core и AspNet.Identity.EntityFramework. введите описание изображения здесь




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему