CreateAsync не сохраняет IdentityUser в базе данных с производным IdentityUser - PullRequest
0 голосов
/ 14 октября 2018

При публикации следующий код работает нормально, пока не достигнет метода _userManager.CreateAsync.Данные не сохраняются в базе данных.

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly ApplicationDbContext _appDbContext;

    private readonly UserManager<IdentityUser> _userManager;

    public ValuesController(UserManager<IdentityUser> userManager, ApplicationDbContext appDbContext)
    {
        _userManager = userManager;
        _appDbContext = appDbContext;
    }

    [HttpPost]
    public async Task<IActionResult> Post()
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        AppUser user = new AppUser();
        user.Email = "email@mail.co.uk";
        user.FirstName = "mark";
        user.LastName = "Macneill";
        user.UserName = "Saints22";
        await _userManager.CreateAsync(user, "P4$$word");

        return new OkObjectResult("Account created");

    }

    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы, кажется, не используете IdentityUser напрямую, а вместо этого AppUser класс.Это может быть класс, расширяющий IdentityUser<> или IdentityUser.Я не уверен, что у вас есть остальные настройки, так что вот процесс:

Если вы создали пользовательский класс AppUser, допустим, вы создали его следующим образом:

class AppUser : IdentityUser<int>

Это будет означать, что вы назначили первичный ключ, как в int.Однако, если вы расширили IdentityUser, обратите внимание, что IdentityUser расширяет IdentityUser<string>, что означает, что ваш ключ является строкой.Продолжая, я собираюсь предположить, что ваш ключ int.Если нет, вы можете внести соответствующие изменения (замените все int s на ваш тип ключа.

В вашем классе запуска необходимо добавить следующее, чтобы зарегистрировать его как свой пользовательский класс, используемый для Identity

services.AddIdentity<AppUser, IdentityRole<int>>()
        .AddEntityFrameworkStores<ApplicationDbContext>();

Ваш ApplicationDbContext должен быть определен следующим образом:

public class ApplicationDbContext : IdentityDbContext<AppUser, IdentityRole<int>, int>

Если вы не хотите использовать IdentityRole<int> в вышеупомянутых двух частях кода, вы можете определитьпользовательский класс роли следующим образом:

public AppUserRole : IdentityRole<int>

После того, как вы настроите эти настройки, вам нужно ввести UserManager<AppUser>, а не UserManager<IdentityUser>.

0 голосов
/ 15 октября 2018

Спасибо Невилл-Назерана

У меня был IdentityUser для внедрения зависимостей, и все, что мне нужно было сделать, это изменить IdentityUser на AppUser.

Startup.cs

services.AddIdentity<AppUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();
...