2017-06-14 26 views
1

我正在使用SQLite数据库的WPF应用程序。尝试用SQLite.CodeFirst的代码优先方法设计数据库。SQLite.CodeFirst - 创建模型时无法使用上下文

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

进出口代码:

  1. 的DbContext:

    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; } 
    
    } 
    
  2. MainWindowViewModel - 只是初始化数据库

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

    <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="System.Data.SQLite.EF6" /> <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> </DbProviderFactories> </system.data> <connectionStrings> <add name="connection" connectionString="Data Source=.\GestDB" providerName="System.Data.SqlLite"/> </connectionStrings>

+0

什么的IDatabaseCreator.Create() - 方法做?我假设你正在试图在创建模型时使用上下文来创建值,或者模型构建者是错误的。 – DevilSuichiro

回答

1

我在变量实例保存OnModelCreating模型构建器

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); 
} 

并执行它一次(我需要创建结构一次)

​​
相关问题