Pregunta

El año pasado, utilicé Subsonic 3 y SQLite en un proyecto VS2008 con mucho éxito y estaba bastante satisfecho con los resultados. Recientemente, intenté configurar Subsonic 3 y SQLite en un proyecto VS2010 y me he cumplido con la excepción interna al intentar instanciar un nuevo SimplePosepery:

El tipo inicializador de 'system.data.sqlite.sqlitefactory' lanzó una excepción

Solo para asegurarme de que no me estaba volviendo loco, probé exactamente el mismo código y el archivo App.Config en VS2008 y no hay problema. ¡Extraño!

Actualmente, estoy usando Subsonic 3.0.0.4 y la versión x64 de System.Data.SQLite 1.0.73.0 (3.7.6.3) (aunque también probé la versión de 32 bits). Agregué ambos DLL como referencia y configurado " Copiar local "a verdadero.

Mi app.config parece:

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

Y mi código se ve como:

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

¿Algunas ideas?

¿Fue útil?

Solución

Estoy usando Subsonic 3 con Visual Studio 2010 y SQLite 1.0.66 y funciona. Sin embargo, hay algunas cosas que tienes que hacer:

  • Su aplicación tiene que ser X86 (no AnyCPU) o obtiene una BadIMageFormateException en máquinas de 64 bits
  • Debe cambiar el marco de destino de "Framework 4.0 Perfil de cliente" a "Framework 4.0"
  • Tiene que agregar (o modificar) esto a su archivo App.Config. Sqlite no funcionará sin el Selegacyv2runTimeActivationPolicy Flag establecido en True

    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    
  • Mi código de inicialización de fábrica se ve así (incluye la versión y el públicokeyToken). Obtuve esta configuración del archivo de máquina. El archivo está ubicado @ %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>
    
  • Mis cadenas de conexión contienen barras en lugar de barras de retroceso en el camino y contiene una versión

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

Espero que ayude.

ACTUALIZACIÓN: Veo que usa una versión x64 de SQLite, así que olvídate de la primera pista. Pero lo dejo, tal vez sea útil para los demás.

Otros consejos

Si no recuerdo mal, el mensaje de error "El tipo inicializador para ... arrojó una excepción" generalmente significa que algo en el constructor estático para el tipo lanzó una excepción. Es posible que quieras intentar abrir System.Data.SQLite.SQLiteFactory en Reflector o Dotpeek o simplemente Decompile o cualquier herramienta que prefiera, y vea lo que está haciendo su constructor estático (.cctor). ¿Tiene TI usando .NET 4 en VS2010 y .NET 2/3 en VS2008? Eso podría ser parte del problema también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top