gpt4 book ai didi

c# - SQLite.CodeFirst - 创建模型时无法使用上下文

转载 作者:太空宇宙 更新时间:2023-11-03 12:26:44 26 4
gpt4 key购买 nike

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

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

我正在使用代码:

  1. 数据库上下文:

    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. 应用程序配置

    <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>

最佳答案

我将 modelBuilderOnModelCreating 保存在一个实例变量中

private DbModelBuilder _modelBuilder;
override protected void OnModelCreating(DbModelBuilder modelBuilder)
{
_modelBuilder = modelBuilder;
}

然后在公共(public)方法中使用它:

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

关于c# - SQLite.CodeFirst - 创建模型时无法使用上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com