【发布时间】:2026-02-10 02:25:01
【问题描述】:
我会这样做:
public class MyDbContext : DbContext {
public MyDbContext(bool readOnlyFlag) {
// Monitor.Enter(theLock); // needed ??
this.readOnlyFlag = readOnlyFlag;
// Database.EnsureCreated(); // needed ??
}
public DbSet<MyData> MyData { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
string connectionString = "Data Source=C:\\mydb.db;";
if (readOnlyFlag) connectionString += "Mode=ReadOnly;";
optionsBuilder.UseSqlite(connectionString);
}
public override void Dispose() {
// Database.CloseConnection(); // needed ??
base.Dispose();
// Monitor.Exit(theLock); // needed ??
}
readonly bool readOnlyFlag;
// readonly object theLock = new object(); // needed ??
}
然后:
using (var dbc = new MyDbContext(true)) {
dbc.MyData.Where( ... code
}
我从多个并发线程调用此类代码以运行不同的查询..(在 .Net Core 3.0 控制台应用程序中)
问题:
-
如果我理解正确,数据库文件将在
李>using块启动时打开,在它结束时关闭。在每个查询上关闭和打开文件似乎效率很低,但我找不到任何关于保留单例MyDbContext(即在Program类中)并重用它是否可以的参考? 如果我可以重复使用
MyDbContext,我是否应该在查询周围使用锁定?一般来说,我是否需要使用上面提到的
Monitor来确保查询不会同时运行?我看过帖子说 Sqlite 需要这个?我需要打电话给
Database.CloseConnection()吗?没有它似乎可以正常工作,但我看过上面所说的帖子?Sqlite 需要 Database.EnsureCreated() 吗?
谢谢!
【问题讨论】:
-
您是否注意到使用单个上下文和多个上下文在效率上的差异?
标签: c# entity-framework sqlite .net-core