我正在使用SQLite数据库的WPF应用程序。尝试使用SQLite.CodeFirst以代码优先方法设计数据库。
错误是:{"在创建模型时不能使用上下文。如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常。请注意,DbContext和相关类的实例成员不保证是线程安全的。"}
我正在使用代码:
的DbContext:
XorPacketDataIO
MainWindowViewModel - 只是初始化数据库
class GestDbContext : DbContext
{
override protected void OnModelCreating(DbModelBuilder modelBuilder)
{
var model = modelBuilder.Build(Database.Connection);
IDatabaseCreator sqliteDatabaseCreator = new SqliteDatabaseCreator();
sqliteDatabaseCreator.Create(Database, model);
}
public DbSet<GestUser> GestUsers { get; set; }
public DbSet<Gesture> Gestures { get; set; }
public DbSet<UserSettings> UserSettings { get; set; }
}
的App.config
#region Constructor
public MainWindowViewModel()
{
using (var context = new GestDbContext())
{
var entity = context.Gestures.Any();
}
}
#endregion
答案 0 :(得分:1)
我在 OnModelCreating 中将 modelBuilder 保存在实例变量中
private DbModelBuilder _modelBuilder;
override protected void OnModelCreating(DbModelBuilder modelBuilder)
{
_modelBuilder = modelBuilder;
}
然后在公共方法中使用它:
public void Init()
{
var model = _modelBuilder.Build(Database.Connection);
IDatabaseCreator sqliteDatabaseCreator = new SqliteDatabaseCreator();
sqliteDatabaseCreator.Create(Database, model);
}
并执行一次(我需要创建一次结构)
public MainWindowViewModel()
{
using (var context = new GestDbContext())
{
var entity = context.Gestures.Any();
context.Init();
}
}