C# 在.NETCore2.0+;SQLite EFCore,并发检查不适用于';删除'; 我首先创建了SQLite数据库,其中包含所有表 然后,我使用PackageManager控制台中的scaffoldDBContext命令生成了DbContext和模型类(用于表) 我使用了一列作为时间戳,并创建了一个SQLite触发器,在insert和update ops之后对其进行更新。DATETIME列实际上在SQLite中创建为文本,但这不是问题所在 在模型类中,我用[ConcurrencyCheck]和[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性修饰了相应的属性(用于DATETIME列) 现在,在通过ASP.Net Core RazorPages测试CRUD ops时,我打开了一个(浏览器)选项卡进行编辑,另一个用于删除 我在编辑页面中修改行内容并将其保存-按预期工作 现在我转到已经打开的删除页面(显示的内容已经过时,因为它在编辑页面中被修改过,就在前面),并尝试删除它 记录已成功删除,而我预期会出现并发异常
为什么会这样?我错过了什么重要的东西吗?提前感谢您的帮助/建议。顺便说一句,我在Windows 10 Pro x64 Build 1709(含最新更新)和.Net Core 2.1.104上使用Visual Studio 2017 Community 15.6.7(最新版本) 问候,, 瓦桑 我的代码中的一些附加信息 我的表格模型类:C# 在.NETCore2.0+;SQLite EFCore,并发检查不适用于';删除'; 我首先创建了SQLite数据库,其中包含所有表 然后,我使用PackageManager控制台中的scaffoldDBContext命令生成了DbContext和模型类(用于表) 我使用了一列作为时间戳,并创建了一个SQLite触发器,在insert和update ops之后对其进行更新。DATETIME列实际上在SQLite中创建为文本,但这不是问题所在 在模型类中,我用[ConcurrencyCheck]和[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性修饰了相应的属性(用于DATETIME列) 现在,在通过ASP.Net Core RazorPages测试CRUD ops时,我打开了一个(浏览器)选项卡进行编辑,另一个用于删除 我在编辑页面中修改行内容并将其保存-按预期工作 现在我转到已经打开的删除页面(显示的内容已经过时,因为它在编辑页面中被修改过,就在前面),并尝试删除它 记录已成功删除,而我预期会出现并发异常,c#,entity-framework,sqlite,asp.net-core,optimistic-concurrency,C#,Entity Framework,Sqlite,Asp.net Core,Optimistic Concurrency,为什么会这样?我错过了什么重要的东西吗?提前感谢您的帮助/建议。顺便说一句,我在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("I
[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; }
}
my DbContext.OnModelCreating()方法的代码段:
modelBuilder.Entity(Entity=>
{
entity.HasIndex(e=>new{e.ClientId,e.TagName})
.IsUnique();
});
my 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>
"
|
返回列表
my 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");
}
公共异步任务OnPostAsync(长?id)
{
if(id==null)
{
返回NotFound();
}
ErrMsg throwErrMsg=()=>
{
ModelState.AddModelError(
字符串。空,
“更新值时出错。请稍后重试”
);
返回页();
};
ClientTag=wait_context.ClientTags.FindAsync(id);
if(ClientTag==null)
{
回程抛掷器rmsg();
}
尝试
{
_context.ClientTags.Remove(ClientTag);
wait_context.SaveChangesAsync();
}
catch(dbupdateconcurrency异常)
{
回程抛掷器rmsg();
}
返回页首(“/索引”);
}
-x-x-x-此问题在此实体框架核心上引用。该问题通过一个工作示例标记为已关闭(因为没有提供更多反馈) 您可能还想查看完整的实现,并与您的实现进行比较
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");
}