Не удалось создать драйвер из NHibernate.Driver.SQLiteDriver - PullRequest
1 голос
/ 04 марта 2011

Извините, я снова отправляю этот вопрос.Я гуглил по нему и нашел много сообщений и потоков по stackoverflow и другим, но ни одна не проснулась для меня.
Я получаю это сообщение об ошибке при запуске моего приложения Windows Forms.Вот мой файл App.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory name="NHibernate.Test">
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
      <property name="connection.connection_string">
        Data Source=nhibernate.db;Version=3;New=True;
      </property>
      <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
      <property name="query.substitutions">true=1;false=0</property>
      <property name="proxyfactory.factory_class">
        NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu
      </property>
    </session-factory>
  </hibernate-configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

Я использую Visual Studio 2010 в 64-разрядной версии Windows Server 2008 R2.Моя конфигурация проекта - X86, и я попробовал x86, x64 и ManagedOnly версии файла System.Data.SQLite.dll, но ни одна из них не работала.

Может кто-нибудь помочь мне с этим?
PS: я знаю, что есть схожие темы с этой, но, пожалуйста, не закрывайте эту тему, потому что ни одно из решений не помогло мне.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Вот ошибка:

NHibernate.HibernateException: Could not create the driver from NHibernate.Driver.SQLiteDriver. ---> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> NHibernate.HibernateException: The IDbCommand and IDbConnection implementation in the assembly SQLite.NET could not be found. Ensure that the assembly SQLite.NET is located in the application directory or in the Global Assembly Cache. If the assembly is in the GAC, use <qualifyAssembly/> element in the application configuration file to specify the full name of the assembly.
   at NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName, String connectionTypeName, String commandTypeName)
   at NHibernate.Driver.SQLiteDriver..ctor()
   --- End of inner exception stack trace ---
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type)
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   --- End of inner exception stack trace ---
   at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings)
   at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings)
   at NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2 properties)
   at NHibernate.Cfg.Configuration.BuildSettings()
   at NHibernate.Cfg.Configuration.BuildSessionFactory()
   at Employee.App.SessionProvider.get_Session() in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\SessionProvider.cs:line 28
   at Employee.App.EmployeeManager.get_Session() in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\EmployeeManager.cs:line 14
   at Employee.App.EmployeeManager.Save(Employee employee) in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\EmployeeManager.cs:line 56
   at Employee.App.frmMain.frmMain_Load(Object sender, EventArgs e) in C:\Users\Ako\documents\visual studio 2010\Projects\Employee\Employee.App\frmMain.cs:line 23
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
0 голосов
/ 29 ноября 2011

Похоже, что сборка SQLite не загружена, следовательно, ошибка:

Не удалось создать драйвер из NHibernate.Driver.SQLiteDriver.---> System.Reflection.TargetInvocationException: исключение было сгенерировано целью вызова.---> NHibernate.HibernateException: не удалось найти реализацию IDbCommand и IDbConnection в сборке SQLite.NET.Убедитесь, что сборка SQLite.NET находится в каталоге приложения или в глобальном кэше сборок.Если сборка находится в GAC, используйте элемент в файле конфигурации приложения, чтобы указать полное имя сборки.

вы можете предварительно загрузить сборку, используя:

PreLoadAssembliesFromPath(AppDomain.CurrentDomain.BaseDirectory);

private static void PreLoadAssembliesFromPath(string p)
{
    //S.O. NOTE: ELIDED - ALL EXCEPTION HANDLING FOR BREVITY

    //get all .dll files from the specified path and load the lot
    FileInfo[] files = null;
    //you might not want recursion - handy for localised assemblies 
    //though especially.
    files = new DirectoryInfo(p).GetFiles("*.dll",SearchOption.AllDirectories);

    AssemblyName a = null;
    string s = null;
    foreach (var fi in files)
    {
        s = fi.FullName;
        //now get the name of the assembly you've found, without loading it
        //though (assuming .Net 2+ of course).
        a = AssemblyName.GetAssemblyName(s);
        //sanity check - make sure we don't already have an assembly loaded
        //that, if this assembly name was passed to the loaded, would actually
        //be resolved as that assembly.  Might be unnecessary - but makes me
        //happy :)
        if (!AppDomain.CurrentDomain.GetAssemblies().Any(assembly =>
          AssemblyName.ReferenceMatchesDefinition(a, assembly.GetName())))
        {
            //crucial - USE THE ASSEMBLY NAME.
            //in a web app, this assembly will automatically be bound from the 
            //Asp.Net Temporary folder from where the site actually runs.
            Assembly.Load(a);
        }
    }
}
0 голосов
/ 06 апреля 2011

Ошибка, по-видимому, связана с созданием драйвера, это говорит о том, что драйвер неправильно установлен в вашей системе. Я только что проверил это, и это работает для меня (хорошо, я использую monodevelop, а не VS), я установил драйвер Sqlite отсюда:

Поставщик ADO.NET 2.0 для SQLite

Затем я использовал это в своем файле app.config:

<session-factory>            
        <property name="dialect">NHibernate.Dialect.SQLiteDialect</property>
        <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
        <property name="connection.driver_class">NHibernate.Driver.SQLiteDriver</property>
        <property name="connection.connection_string">Data Source=SimpleExample.sqlite;Version=3</property>
        <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>         
        <mapping assembly="SimpleExample" />
    </session-factory>
...