我有一个Web应用程序asp.net来查看数据库。从另一个应用程序,数据库文件会上传到服务器,但如果您停止站点并再次启动,Web 应用程序中的表就会更新。重新加载页面没有帮助。
"ConnectionStrings": {
"DefaultConnection": "Data Source=./File/computerservice.db"
}
public IActionResult Index()
{
System.IO.File.Copy("computerservice.db", "./File/computerservice.db", true);
var list = _context.Orders.Where(i => i.InProgress && !i.Deleted).Select(a => new
{
a.Id,
a.DateCreation,
a.NameMaster,
a.Device,
a.NameClient
}).OrderByDescending(i => i.Id).ToList();
return View(list);
}
我将db文件上传到服务器的应用程序:
FtpClient client = new()
{
Host = host,
Credentials = new NetworkCredential(name, password)
};
client.Connect();
try
{
client.UploadFile("./Service/computerservice.db", "www.webapp.com/computerservice.db");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
数据库文件锁定:在您的场景中,Web 应用程序可能会保留与数据库文件的打开连接,这可能会阻止更新可见。 SQLite 似乎是您正在使用的数据库(给定 .db 文件扩展名),它不能很好地处理并发访问,尤其是在 Web 环境中。
缓存:ASP.NET 和实体框架(如果您正在使用它)可以主动缓存数据。如果连接未正确刷新或上下文未正确处理,它可以继续从缓存提供数据,忽略磁盘上的更改。
以下是处理此问题的一些策略:
确保每次操作后正确关闭数据库连接。这对于 SQLite 等基于文件的数据库至关重要。
在实体框架中,这可以通过正确处理上下文或在 using 语句中使用它来控制。但是,从您的代码片段来看,尚不清楚您的 _context 是如何管理的。确保 _context 在使用后被处置,或者如果问题仍然存在,请考虑为每个操作创建一个新的上下文实例:
public IActionResult Index()
{
System.IO.File.Copy("computerservice.db", "./File/computerservice.db", true);
using (var context = new YourDbContext())
{
var list = context.Orders.Where(i => i.InProgress && !i.Deleted).Select(a => new
{
a.Id,
a.DateCreation,
a.NameMaster,
a.Device,
a.NameClient
}).OrderByDescending(i => i.Id).ToList();
return View(list);
}
}
通过重置连接池(如果适用)或为每个请求创建 DbContext 的新实例来强制刷新数据库连接,如上所述。
如果您尚未对 DbContext 使用依赖项注入,请考虑在 Startup.cs 中配置它。这可确保您为每个请求获得新鲜的上下文,这在以下场景中会有所帮助:
services.AddDbContext<YourDbContext>(options =>
options.UseSqlite("Data Source=./File/computerservice.db"));
然后,将 DbContext 注入到您的控制器中:
private readonly YourDbContext _context;
public YourController(YourDbContext context)
{
_context = context;
}
在查询数据库之前,请确保文件复制操作已成功完成。有时,文件操作可能会延迟或不会立即同步到磁盘。
考虑实现一种机制来检测数据库文件何时更新,然后相应地刷新或重置数据库上下文。这可能涉及文件观察器或检查文件更改的自定义逻辑。 其他注意事项
测试不同的环境:如果您在本地测试并在不同的服务器上部署,请确保跨环境的行为一致。 数据库选择:评估 SQLite 是否适合您的用例,特别是如果您期望高并发性或需要更强大的连接处理。