Domanda

L'anno scorso ho usato Subsonic 3 e SQLite in un progetto VS2008 con molta successo ed ero abbastanza soddisfatto dei risultati. Proprio di recente, ho provato a configurare Subsonic 3 e SQLite in un progetto VS2010 e sono stato accolto con l'eccezione interiore quando ho provato a istanziare un nuovo SimpleSository:

L'inizializzatore di tipo per 'System.data.sqlite.sqlitefactory' ha lanciato un'eccezione

Solo per assicurarmi che non stavo impazzendo, ho provato esattamente lo stesso codice e il file app.config in VS2008 e nessun problema. Strano!

Attualmente, sto usando Subsonic 3.0.0.4 e la versione X64 di System.Data.Sqlite 1.0.73.0 (3.7.6.3) (anche se ho provato anche la versione a 32 bit.) Ho aggiunto entrambe le DLL come riferimento e set " Copia locale "a true.

La mia app.config sembra:

  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>

  <connectionStrings>
    <add name="myDatabase" connectionString="Data Source=C:\DB\mydatabase.db3" providerName="System.Data.SQLite"/>
  </connectionStrings>

E il mio codice sembra:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SubSonic.Repository;

namespace SubSonicSqliteTestConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            var repo = new SimpleRepository("myDatabase", SimpleRepositoryOptions.RunMigrations);
        }
    }
}

Qualche idea?

È stato utile?

Soluzione

Sto usando Subsonic 3 con Visual Studio 2010 e SQLite 1.0.66 e funziona. Tuttavia ci sono alcune cose che devi fare:

  • La tua applicazione deve essere x86 (non anycpu) o ottieni BadImageFormatexception su macchine a 64 bit
  • È necessario modificare il framework target da "Framework 4.0 Profilo client" a "Framework 4.0"
  • Devi aggiungere (o modificare) questo al tuo file app.config. SQLite non funzionerà senza la bandiera UselegacyV2RuntimeActivationPolicy impostata su True

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    
  • Il mio codice di inizializzazione in fabbrica sembra questo (include la versione e il publickeytoken). Ho ottenuto queste impostazioni dal file Machine.Config sul mio Dev Machine in cui ho eseguito l'installazione e ho scelto di integrare SQLite su Visual Studio 2010 (dalla cartella All Programmi SQLite). Il file si trova @ %WinDir%\Microsoft.NET\Framework\<FrameworkVersion>\CONFIG

    <system.data>
        <DbProviderFactories>
    
            <remove invariant="System.Data.SQLite" />
            <add name="SQLite Data Provider" invariant="System.Data.SQLite"
                       description=".Net Framework Data Provider for SQLite"
                       type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    
        </DbProviderFactories>
    </system.data>
    
  • Le mie stringhe di connessione contiene barre invece di backsheshes nel percorso e contiene una versione

    <connectionStrings>
        <add name="connectionstringname"
                   connectionString="Data Source=c:/temp/mydatabase.db;Version=3;"
                   providerName="System.Data.SQLite"/>
    </connectionStrings>
    

Spero possa aiutare.

AGGIORNAMENTO: ti vedo usare una versione X64 di SQLite, quindi dimentica il primo suggerimento. Ma lo lascio, forse è utile per gli altri.

Altri suggerimenti

Se ricordo bene, il messaggio di errore "Il tipo di inizializzatore per ... ha lanciato un'eccezione" di solito significa che qualcosa nel costruttore statico per il tipo ha lanciato un'eccezione. Potresti voler provare ad aprire System.Data.SQLite.SQLiteFactory In Reflector o Dotpeek o Justdecompile o qualunque strumento preferisca e vedi cosa sta facendo il suo costruttore statico (.cctor). Hai TI usando .NET 4 in VS2010 e .NET 2/3 in VS2008? Potrebbe anche essere parte del problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top