c# - 在 .Net Core 2.0 + SQLite EFCore 中,并发检查不适用于“删除”
问题描述
- 我首先创建了我的 SQLite 数据库,其中包含所有表
- 然后,我使用包管理器控制台中的 Scaffold-DbContext 命令生成了 DbContext 和模型类(用于表)
- 我使用一列作为时间戳并创建到 SQLite 触发器以在插入和更新操作后对其进行更新。DATETIME 列实际上是在 SQLite 中创建为 TEXT 的,但这不是这里的问题
- 在模型类中,我用
[ConcurrencyCheck]
和[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
属性装饰了相应的属性(对于 DATETIME 列) - 现在,在通过我的 ASP.Net Core RazorPages 测试我的 CRUD 操作时,我打开了一个(浏览器)选项卡用于编辑,另一个用于删除
- 我修改编辑页面中的行内容并保存 - 按预期工作
- 现在我转到已经打开的删除页面(显示的内容已经过时,因为它在之前的编辑页面中被修改过)并尝试删除它
- 记录被成功删除,而我预计会出现并发异常
为什么会这样?我错过了一些重要的东西吗?提前感谢您的任何帮助/建议。顺便说一句,我在 Windows 10 Pro x64 Build 1709(带有最新更新)和 .Net Core 2.1.104 上使用 Visual Studio 2017 Community 15.6.7(最新)
问候, 瓦桑
我的代码中的一些附加信息
我的表模型类:
[Table("Client_Tags")]
public partial class ClientTags
{
[Key]
[Column("ID")]
[Display(Name = "Row ID")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
[Required]
[Column("Client_ID", TypeName = "VARCHAR(255)")]
[Display(Name = "Client ID")]
public string ClientId { get; set; }
[Required]
[Column("Tag_Name", TypeName = "VARCHAR(255)")]
[Display(Name = "Tag")]
public string TagName { get; set; }
[Column("Last_Updated", TypeName = "DATETIME")]
[Display(Name = "Last Updated Time")]
[ConcurrencyCheck]
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public string LastUpdated { get; set; }
}
我的 DbContext.OnModelCreating() 方法的片段:
modelBuilder.Entity<ClientTags>(entity =>
{
entity.HasIndex(e => new { e.ClientId, e.TagName })
.IsUnique();
});
我的 Delete.cshtml 中的片段:
<form method="post">
<input type="hidden" asp-for="ClientTag.Id" />
<input type="hidden" asp-for="ClientTag.LastUpdated" />"
<input type="submit" value="Delete" class="btn btn-default" /> |
<a asp-page="./Index">Back to List</a>
</form>
来自我的 Delete.cshtml.cs 的片段:
public async Task<IActionResult> OnPostAsync(long? id)
{
if (id == null)
{
return NotFound();
}
ErrMsg throwErrMsg = () =>
{
ModelState.AddModelError(
string.Empty,
"Error updating the values. Try again later"
);
return Page();
};
ClientTag = await _context.ClientTags.FindAsync(id);
if (ClientTag == null)
{
return throwErrMsg();
}
try
{
_context.ClientTags.Remove(ClientTag);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException e)
{
return throwErrMsg();
}
return RedirectToPage("./Index");
}
-xxx-
解决方案
推荐阅读
- animation - Flutter 上的 Lottie 闪屏
- azure - 在 azure 管道上拉取并运行 Linux docker 映像
- r - plot.ACF 是否从 NLME 的前端中删除?还是我在意外中更改了某些设置?
- bash - MQTT 的 Bash 脚本
- r - 如何解决可变长度不同的问题?
- openshift - 在 OpenShift Node.js 服务器上设置 SSL 证书时遇到问题
- python - 如何修复 self._validate_spec(raw_spec) 中的异常?
- python-2.7 - 我的 Python 2.7 代码中有语法错误。我需要帮助
- html - 如何制作一个 python 烧瓶路由,根据按下的按钮显示 .csv 文件的某一行
- c# - 从数组中删除数据时遇到问题