c# - 在 .Net Core 2.0 + SQLite EFCore 中,并发检查不适用于 'delete'

标签 c# entity-framework sqlite asp.net-core optimistic-concurrency

  1. 我首先创建了我的 SQLite 数据库,其中包含所有表
    1. 然后我使用包管理器控制台中的 Scaffold-DbContext 命令生成了 DbContext 和模型类(用于表)
    2. 我为时间戳使用了一个列,并创建了 SQLite 触发器以在插入和更新操作后更新它。 DATETIME 列实际上在 SQLite 中创建为 TEXT 但这不是这里的问题
    3. 在模型类中,我用 [ConcurrencyCheck][DatabaseGenerated(DatabaseGeneratedOption.Computed)] 属性装饰了相应的属性(对于 DATETIME 列)
    4. 现在,在通过我的 ASP.Net Core RazorPages 测试我的 CRUD 操作时,我打开了一个(浏览器)选项卡用于编辑,另一个用于删除
    5. 我修改了编辑页面中的行内容并保存 - 按预期工作
    6. 现在我转到已经打开的删除页面(显示的内容已经过时,因为它在之前的编辑页面中被修改过)并尝试删除它
    7. 记录已成功删除,而我预计会出现并发异常

为什么会这样?我错过了一些重要的东西吗?在此先感谢您的帮助/建议。顺便说一句,我在 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");
    }

-x-x-x-

最佳答案

此 Entity Framework Core 中引用了此问题 issue .该问题被标记为已关闭并带有一个工作示例(并且因为没有提供更多反馈)。

您可能还想查看 this blog post查看完整的实现并与您的进行比较。

关于c# - 在 .Net Core 2.0 + SQLite EFCore 中,并发检查不适用于 'delete',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50087940/

相关文章:

c# - 当我从 AWS 迁移到 Azure Data Lake 时,如何避免存储此文件?

c# - 将 2 个表绑定(bind)在一起(一对多关系)

android - 使用本地 SQlite 数据库填充可扩展 ListView 的方法

c# - 如何在 Zebra 打印机上使用 windows-1250 代码页进行打印?

c# - 自定义角色提供者 - DbContext 处置

c# - EF SaveChanges() 背后发生了什么

python - 从 sqlite 数据库中获取多行,合并共享相同日期的行,然后在表中打印

django - 为什么 django test --keep-db 适用于 postgres 数据库但不适用于默认的 sqlite3

javascript - 跨域 Javascript 访问 WCF 自托管服务时出现 404/405 错误

ios:CoreData实体继承