
[英]ASP.Net Core 3.1 Razor Pages and CRUD operation with Dapper
[英]asp.net core 3.1 EF ConcurrencyCheck not working using razor CRUD scaffolding not MVC
我是 ConcurrencyCheck 的新手 我开始了一个新的空白 asp.net 核心 VStudio 项目,我只使用 Razor 页面和 CRUD razor 脚手架。 当我尝试使用 [ConcurrencyCheck] 设置的模型类属性进行更改时,即使我是唯一一个在调试模式下访问我的测试设置和 dbase 的人,我也会收到 DbUpdateConcurrencyException。 我不明白 ConcurrencyCheck 应该如何工作吗? 我认为它不应该遇到任何异常。
这是我的代码..它都是vanilla/blank VStudio项目,只是下面的上下文和模型类文件以外的默认内容。
我的背景
public class AppDbContext :DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options)
{
}
public DbSet<CustInfo> cust_info { get; set; }
}
我的模特
public class CustInfo
{
[Key]
public int request_id { get; set; }
[ConcurrencyCheck]
public string customer_name { get; set; }
[ConcurrencyCheck]
public string customer_phone { get; set; }
[ConcurrencyCheck]
public string customer_email { get; set; }
}
我的编辑剃刀页面 .cs
public class EditModel : PageModel
{
private readonly TestApp.Classes.AppDbContext _context;
public EditModel(TestApp.Classes.AppDbContext context)
{
_context = context;
}
[BindProperty]
public CustInfo CustInfo { get; set; }
public async Task<IActionResult> OnGetAsync(int? id)
{
if (id == null)
{
return NotFound();
}
CustInfo = await _context.cust_info.FirstOrDefaultAsync(m => m.request_id == id);
if (CustInfo == null)
{
return NotFound();
}
return Page();
}
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details, see https://aka.ms/RazorPagesCRUD.
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Attach(CustInfo).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CustInfoExists(CustInfo.request_id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToPage("./Index");
}
private bool CustInfoExists(int id)
{
return _context.cust_info.Any(e => e.request_id == id);
}
}
当我在编辑页面上并更改客户的电子邮件地址时,如果在“await _context.SaveChangesAsync();”上设置了断点,则单击保存按钮行,它遇到以下异常
{“数据库操作预计会影响 1 行,但实际上影响了 0 行。自加载实体以来,数据可能已被修改或删除。请参阅http://go.microsoft.com/fwlink/?LinkId=527962有关理解和处理乐观并发异常的信息。"}
我希望不会有任何例外,所以无法弄清楚为什么这不起作用。 我认为保存到 dbase 会起作用,因为我是唯一一个更改任何调试该项目的人。 如果我从模型类中的 customer_name、customer_phone 和 customer_email 中删除 [ConcurrencyCheck],然后更改其中任何一个,则不会发生异常。 只是想弄清楚这些东西,所以我可以用断点测试调试这个项目,然后从 sql 端更改数据库中的值,并看到实际的并发问题发生了 :) 但我什至无法让它工作,即使我' m 不更改数据库中幕后的任何内容。
_context.Attach(CustInfo).State = EntityState.Modified;
没有关于您的实体在数据库中的实际状态的信息。 您必须从数据库中获取您的实体,对其进行更改,然后保存更改。CustInfo
类中删除所有ConcurrencyCheck
属性,并添加另一个用TimestampAttribute
注释的byte[]
类型的属性,它将扮演并发令牌的角色。 EF 在插入或更新时自动生成其值,并在更新操作期间检查其值是否已被其他人更改以防止并发访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.