NHibernate + SqlServerCE

时间:2010-11-07 13:07:05

标签: c# nhibernate

我遇到此异常的问题:

Hibernate.HibernateException : Could not create the driver from Hibernate.Driver.SqlServerCeDriver.
----> System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
----> NHibernate.HibernateException : The IDbCommand and IDbConnection implementation in the  ssembly System.Data.SqlServerCe could not be found. Ensure that the assembly System.Data.SqlServerCe 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.

我尝试了一切。我google了很多。

System.Data.SqlServerCe.dll位于调试目录中。是本地引用的,不是我的GAC。我复制本地设置为true。在调试目录中是所有其他所需的sql * .dll。我试过x86编译但是没有。

这是我的nhibernate配置:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>

    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Spring.ProxyFactoryFactory, NHibernate.ByteCode.Spring</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>

    <property name="show_sql">true</property>


    <!-- mapping files -->

  </session-factory>
</hibernate-configuration>

NHibernate 3.0 beta 1版,SqlServerCe版本3.5 SP1

我的想法: Nhibernate仍然在GAC中查看,因为已经安装了SqlServerCe,卸载后问题就开始了。我怎么能对NHibernate说:“请看看这个dll?”:)

4 个答案:

答案 0 :(得分:11)

您(或NHibernate dll)在项目中引用的System.Data.SqlServerCe dll的版本不同于预期的版本。例如,NHibernate可能引用了dll的.NET 3.5版本,但是你在GAC或本地bin目录中拥有了.NET 4.0版本的dll。您可以指示.NET框架使用特定的AssemblyBinding来纠正问题。在配置文件中键入以下内容以进行修复。

    <runtime>
    <assemblyBinding 
    xmlns="urn:schemas-microsoft-com:asm.v1"><qualifyAssembly 
   partialName="System.Data.SqlServerCe" fullName="System.Data.SqlServerCe, 
   Version=3.5.1.0, Culture=neutral, 
   PublicKeyToken=89845dcd8080cc91"/>
    </assemblyBinding>
   </runtime> 

答案 1 :(得分:0)

在NHibernate请求之前,尝试使用Assembly.LoadFile加载带有DLL完整路径的程序集。

NHibernate将使用Assembly.Load("NHibernate.Driver.SqlServerCeDriver")加载程序集,这可能会在GAC中查找。如果您强制从文件加载它,Assembly.Load会注意到它已经加载并选择您加载的文件。

答案 2 :(得分:0)

您还可以在VS中针对该引用的属性将特定于用户的版本标志设置为false,并将copy local设置为true

答案 3 :(得分:-1)

我切换到了sqlite。那是工作。也许考虑改变字节码。我使用了春天字节码,也许城堡更好....