SQLite.CodeFirst - 在创建模型时不能使用上下文

时间:2017-06-14 21:59:45

标签: c# wpf entity-framework sqlite

我正在使用SQLite数据库的WPF应用程序。尝试使用SQLite.CodeFirst以代码优先方法设计数据库。

错误是:{"在创建模型时不能使用上下文。如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常。请注意,DbContext和相关类的实例成员不保证是线程安全的。"}

我正在使用代码:

  1. 的DbContext:

    XorPacketDataIO
  2. 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; }
    
    }
    
  3. 的App.config

    #region Constructor public MainWindowViewModel() { using (var context = new GestDbContext()) { var entity = context.Gestures.Any(); } } #endregion

1 个答案:

答案 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();
  }
}