c# - C# SQLite 数据库锁定异常
问题描述
我正在尝试使用 SaveChangesAsync 方法将数据保存到我的数据库中,起初用户正在登录(用户的 isOnline bool 属性为 true 并将更改保存到数据库)但是当我注销时我正在执行完全相同的方法(使用isOnline 设置为 false),然后在 SaveChangesAsync - SQLiteException 弹出时,我查看了异常信息,它说数据库以某种方式被锁定。
public readonly ProjectDbContext _projectDbContext;
public UserRepository(ProjectDbContext projectDbContext)
{
_projectDbContext = projectDbContext;
}
public async Task<User> Logout(User user)
{
var userList = _projectDbContext.Users.ToList();
foreach (var userX in userList)
{
if (userX.Id == user.Id)
{
userX.IsOnline = false;
try
{
await _projectDbContext.SaveChangesAsync();
}
catch (SqliteException e)
{
var str = e.Data;
return userX;
}
return userX;
}
}
return null;
}
public async Task<User> GetUserAsync(User user)
{
var userList = _projectDbContext.Users.ToList();
foreach (var userX in userList)
{
if (userX.UserName == user.UserName && userX.Password == await HashMD5(user.Password))
{
userX.IsOnline = true;
await _projectDbContext.SaveChangesAsync();
return userX;
}
}
return null;
}
异常消息:
{Microsoft.Data.Sqlite.SqliteException (0x80004005): SQLite Error 5: 'database is locked'.
at Microsoft.Data.Sqlite.SqliteException.ThrowExceptionForRC(Int32 rc, sqlite3 db)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.Sqlite.SqliteCommand.ExecuteNonQuery()
at Microsoft.Data.Sqlite.SqliteConnectionExtensions.ExecuteNonQuery(SqliteConnection connection, String commandText)
at Microsoft.Data.Sqlite.SqliteTransaction..ctor(SqliteConnection connection, IsolationLevel isolationLevel)
at Microsoft.Data.Sqlite.SqliteConnection.BeginTransaction(IsolationLevel isolationLevel)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionWithNoPreconditions(IsolationLevel isolationLevel)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionAsync(CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple`2 parameters, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IReadOnlyList`1 entriesToSave, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at ServerSideAngularProject.DAL.UserRepository.Logout(User user) in C:\Users\osher\source\repos\ServerSideAngularProject\ServerSideAngularProject\DAL\UserRepository.cs:line 33}
解决方案
推荐阅读
- excel - Excel干净的搜索和匹配
- javascript - 创建用户文件上传按钮时,如何选择要上传文件的文件夹?
- c++ - 16位系统中的程序如何访问超过65535但不能访问地址的整数
- c++ - 在同一头文件中定义的对模板运算符的未定义引用
- javascript - 如何防止幻灯片的 figcaption 在每个图像加载时上下跳跃?
- python - python - regex replace everything between 2 strings only in the first occourence of a character
- javascript - CHM 查看器禁止在 Windows 10 上访问 JavaScript 中的“窗口”对象
- apache-kafka - Kafka连接消费者引用偏移量并存储在消息中
- c - 这种对信号的解释是否正确?
- python-3.x - selenium.common.exceptions.ElementNotInteractableException:消息:元素不可交互(会话信息:chrome=81.0.4044.138)