我想在我的应用程序中注册新用户,所以我具有以下组件: 注册模型
public class RegisterModel
{
[Required]
public string Login { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Required]
[DataType(DataType.Password)]
[Compare("Password", ErrorMessage = "Passwords doesn't match")]
public string PasswordCompare { get; set; }
[Required]
public int Tier { get; set; }
}
与表格有关
<form asp-antiforgery="true" method="post" role="form">
<div class="validation" asp-validation-summary="ModelOnly"></div>
<div class="form-group">
<label for="Login">Login:</label>
<div>
<input required asp-for="Login" type="text" name="Login" value="@Model?.Login">
</div>
</div>
<div class="form-group">
<label asp-for="Password">Password</label>
<input asp-for="Password" type="password" />
<span asp-validation-for="Password" />
</div>
<div class="form-group">
<label asp-for="PasswordCompare">Confirm password</label>
<input asp-for="PasswordCompare" type="password" />
<span asp-validation-for="PasswordCompare" />
</div>
<div class="form-group">
<label for="Tier">Tier of access:</label>
<div>
<input required asp-for="Tier" type="number" name="Tier" value="@Model?.Tier">
</div>
</div>
<div class="form-group">
<input type="submit" value="Create" />
</div>
</form>
我的数据库中代表用户的表
CREATE TABLE [dbo].[AdministratorUsers] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Login] NVARCHAR (MAX) NOT NULL,
[PasswordHash] NVARCHAR (MAX) NOT NULL,
[Tier] INT NOT NULL,
CONSTRAINT [PK_AdministratorUsers] PRIMARY KEY CLUSTERED ([Id] ASC)
);
和类实体
public class AdministratorUser
{
[Key]
public int Id { get; set; }
public string Login { get; set; }
public string PasswordHash { get; set; }
public int Tier { get; set; } = 0;
}
将注册模型转换为用户实体并将其保存到数据库的操作。
[HttpPost("accounts/create", Name = "AdminAccountCreate")]
public async Task<IActionResult> Create([FromServices] IGenPasswordHash genPassHash, RegisterModel regModel)
{
string passwordHash = genPassHash.GenerateHash(regModel.Password);
await db.AdministratorUsers.AddAsync(new AdministratorUser
{
Login = regModel.Login,
PasswordHash = passwordHash,
Tier = regModel.Tier
});
return RedirectToAction("Accounts");
}
但是以某种方式它不起作用。我已经修复了所有可能找到的潜力,这是我能够提供的最清晰的版本。
答案 0 :(得分:2)
添加实体后,您需要提交更改。为此,您可以针对具体情况写db.AdministratorUsers.SaveChanges()
。
编辑:看来.AddAsync()
并没有这样做(请参阅编辑修订)。如果我深入了解异步操作与正常操作之间的差异,我将继续对此进行调查并编辑此答案。从本质上讲,如果要添加一个巨大的对象并且不必介意等待添加该对象,则为了使相关线程完成用户的请求,您不应该使用异步。但是,如果您不依赖于此,那么如果允许单独的线程为您执行该操作就可以了,那么在发送请求的客户端会收到一个“ OK”,表示一切都已成功解决,或者通过其他方式解决了同时使用.Async
变体。
我认为它在这些行中有所作为的原因是因为我使用了.SaveChangesAsync()
一次,并且它以5秒的延迟添加了我的对象,而没有Async则没有任何中断。我的应用程序在很大程度上取决于在发出用户请求时添加到数据库中的对象,因此为什么我再也没有尝试过。
答案 1 :(得分:2)
您应该在AddAsync方法之后调用SaveChanges函数。
db.AdministratorUsers.SaveChanges();
答案 2 :(得分:1)
您需要调用db.SaveChanges()方法,否则所做的更改将不会影响到数据库。
[HttpPost("accounts/create", Name = "AdminAccountCreate")]
public async Task<IActionResult> Create([FromServices] IGenPasswordHash genPassHash, RegisterModel regModel)
{
string passwordHash = genPassHash.GenerateHash(regModel.Password);
await db.AdministratorUsers.AddAsync(new AdministratorUser
{
Login = regModel.Login,
PasswordHash = passwordHash,
Tier = regModel.Tier
});
// Add this
db.SaveChanges();
return RedirectToAction("Accounts");
}