web-dev-qa-db-fra.com

Comment appeler SQLitePCL.Batteries.Init ().?

J'essaie de créer une base de données SQLite pour mon application et j'ai rencontré cette erreur.

System.Exception: 'Vous devez appeler SQLitePCL.raw.SetProvider (). Si vous utilisez un package bundle, cela se fait en appelant SQLitePCL.Batteries.Init (). '

J'ai créé une application console simple, exécutez le même code exact pour la création, sans aucun problème. Le code ressemble à ça!

using (var dataContext = new SampleDBContext())
{
    dataContext.Accounts.Add(new Account() { AccountName = name, AccountBalance = balance });
}


public class SampleDBContext : DbContext
{
    private static bool _created = false;
    public SampleDBContext()
    {
        if (!_created)
        {
            _created = true;
            Database.EnsureDeleted();
            Database.EnsureCreated();
        }
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
    {
        optionbuilder.UseSqlite(@"Data Source="Source folder"\Database.db");
    }

    public DbSet<Account> Accounts { get; set; }
}

Quelqu'un peut-il faire la lumière sur la question? J'ai installé les mêmes packages Nuget sur les deux projets, la seule différence entre les deux est la source de données et les classes POCO que j'ai utilisées pour la base de données.

Merci.

Modifier Mon programme se compose actuellement d'un Console application Qui fait référence à un .Net Framework Class Library. Le simple Console application A un constructeur qui ressemble à ceci:

public Program()
{   
    using (var db = new FinancialContext())
    {
        db.Accounts.Add(new Account() { AccountName = "RBS", AccountBalance=20 });
    }
}

La bibliothèque de classes a un FinancialContext comme suit:

public class FinancialContext : DbContext
{
    public DbSet<Account> Accounts { get; set; }

    public FinancialContext()
    {
      # Database.EnsureDeleted();
        Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder)
    {
        optionbuilder.UseSqlite(@"Data Source="Some Source Folder"\Database.db");
    }
}

L'erreur ci-dessus est affichée au point de symbole #, y a-t-il un problème avec la façon dont je code? Je voudrais vraiment savoir quel est le problème afin que je puisse le résoudre correctement plutôt que d'appliquer un "correctif". J'ai aussi essayé la suggestion dans les commentaires, mais mettre la ligne de code SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3()); dans Console Application A donné l'erreur SQLitePCL n'est pas dans le contexte actuel, ce qui me laisse penser que je manque une référence?

17
Tristan Trainer

Cela m'est arrivé lorsque j'ai essayé d'éviter toute dépendance supplémentaire et j'ai opté pour le Microsoft.EntityFrameworkCore.Sqlite.Core paquet.

Vous devez installer et utiliser le Microsoft.EntityFrameworkCore.Sqlite package à la place, qui dépend du package SQLitePCLRaw.

27
René Schindhelm

Pour une raison quelconque, le Nuget Package n'avait pas installé les références requises, réinstallé le paquet et il a corrigé le problème!

Manque le SQLitePCL.raw* les références.

1
Tristan Trainer

J'ai eu cette erreur très exacte. Il s'est avéré que j'avais un package Microsoft.Data.Sqlite.Core (2.2.4) installé, mais pas SQLitePCLRaw.bundle_winsqlite3.

Installation du package SQLitePCLRaw.bundle_winsqlite3 (1.1.13) a résolu le problème.

1
Varus Septimus

Installer Nuget PackageMicrosoft.Data.Sqlite (ne pas Microsoft.Data.Sqlite.Core). (ma version est 2.2.2)

et utilisez SQLitePCL.raw.SetProvider (nouveau SQLitePCL.SQLite3Provider_e_sqlite3 ());

 connection = new SqliteConnection("Data Source = Sample.db");

 SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());

 connection.Open();

mais je conseille d'utiliser nuget packageSystem.Data.SQLite au lieu Microsoft.Data.Sqlite

0
Stepan Ivanenko