2010-12-30 24 views
6

Tôi vừa thiết lập NHibernate lần đầu tiên. nền tảng và cấu hình của tôi cài đặt như sau:Cấu hình NHibernate 3.0 với ODP.NET

  • Cơ sở dữ liệu: Oracle 11.1g
  • ODP.NET Version: 4.112.1.2 (Đã cài đặt từ ODTWithODAC112012, mà là một phiên bản 1 ở trên cài đặt db Oracle của tôi)
  • NHibernate Phiên bản 3.0

Tôi đã tạo một ứng dụng MVC thử nghiệm với một dự án thử nghiệm. Sau đó, để kiểm tra kết nối NHibernate, tôi sử dụng bộ ghép đo sau:

using IBCService.Models; 
using NHibernate.Cfg; 
using NHibernate.Tool.hbm2ddl; 
using NUnit.Framework; 
namespace IBCService.Tests 
{ 
    [TestFixture] 
    public class GenerateSchema_Fixture 
    { 
     [Test] 
     public void Can_generate_schema() 
     { 
      var cfg = new Configuration(); 
      cfg.Configure(); 
      cfg.AddAssembly(typeof(Product).Assembly); 
      new SchemaExport(cfg).Execute(false, true, false); 
     } 
    } 

Các Nhibernate tập tin cấu hình:

<?xml version="1.0" encoding="utf-8"?> 
<!-- This config use Oracle Data Provider (ODP.NET) --> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > 
    <session-factory name="NHibernate.Test"> 
    <property name="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</property> 
    <property name="connection.connection_string"> 
     User ID=TEST;Password=******;Data Source=//RAND 
    </property> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="show_sql">false</property> 
    <property name="dialect">NHibernate.Dialect.Oracle10gDialect</property> 
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property> 
    </session-factory> 
</hibernate-configuration> 

Mở thử nghiệm, tôi nhận được ngoại lệ stack trace sau:

NHibernate.HibernateException was unhandled by user code 
    Message=Could not create the driver from NHibernate.Driver.OracleDataClientDriver. 
    Source=NHibernate 
    StackTrace: 
     at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 113 
     at NHibernate.Connection.ConnectionProvider.Configure(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 64 
     at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProviderFactory.cs:line 50 
     at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction, Boolean export, Boolean justDrop) in d:\CSharp\NH\nhibernate\src\NHibernate\Tool\hbm2ddl\SchemaExport.cs:line 333 
     at NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Boolean script, Boolean export, Boolean justDrop) in d:\CSharp\NH\nhibernate\src\NHibernate\Tool\hbm2ddl\SchemaExport.cs:line 290 
     at IBCService.Tests.GenerateSchema_Fixture.Can_generate_schema() in D:\APPS\VS2010\IBanking\CustomerService\IBCService.Tests\GenerateSchema_Fixture.cs:line 21 
    InnerException: System.Reflection.TargetInvocationException 
     Message=Exception has been thrown by the target of an invocation. 
     Source=mscorlib 
     StackTrace: 
      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 System.Activator.CreateInstance(Type type) 
      at NHibernate.Bytecode.ActivatorObjectsFactory.CreateInstance(Type type) in d:\CSharp\NH\nhibernate\src\NHibernate\Bytecode\ActivatorObjectsFactory.cs:line 9 
      at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary`2 settings) in d:\CSharp\NH\nhibernate\src\NHibernate\Connection\ConnectionProvider.cs:line 107 
     InnerException: System.NullReferenceException 
      Message=Object reference not set to an instance of an object. 
      Source=NHibernate 
      StackTrace: 
       at NHibernate.Driver.OracleDataClientDriver..ctor() in d:\CSharp\NH\nhibernate\src\NHibernate\Driver\OracleDataClientDriver.cs:line 42 
      InnerException: 

Nếu tôi thay đổi NHibernate.Driver.OracleDataClientDriver sang NHibernate.Driver.OracleClientDriver (MS provider for Oracle), thử nghiệm thành công. Ai đó có thể cho tôi biết tôi đang làm gì sai?

Trả lời

13

Hi Tôi nghĩ rằng lỗi xảy ra, vì Nhibernate không tải trình điều khiển từ GAC với Assembly.LoadWithPartialName(), nhưng với Assembly.Load(). Hãy thử đặt Oracle.DataAccess.dll trong thư mục bin hoặc sử dụng phần qualifyAssembly vào app.config hoặc web.config của bạn. Ví dụ:

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
<qualifyAssembly partialName="Oracle.DataAccess" 
fullName="Oracle.DataAccess, Version=2.102.2.20, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
</assemblyBinding> 
</runtime> 
+0

Cảm ơn! Điều đó cố định nó! –

+0

@SilasHansen: Nếu điều này giải quyết được vấn đề của bạn, bạn nên đánh dấu Câu trả lời là Đã chấp nhận. –

+0

Đã thêm phần thời gian chạy trong app.config; thay đổi các hành động xây dựng của Oracle.DataAccess để "Sao chép địa phương", vẫn có cùng một lỗi trên cửa sổ của tôi 7 (64 bit) máy. Đường dẫn tham chiếu của Oracle.DataAccess là: C: \ Windows \ assembly \ GAC_32 \ Oracle.DataAccess \ 2.112.1.0__89b483f429c47342 \ Oracle.DataAccess.dll – PerlDev

1

@PerlDev: Tôi nghĩ rằng bạn có một "ODP.NET 32 bit nhị phân" cài đặt và bạn đang soạn thảo ứng dụng của bạn với nền tảng "AnyCPU". Nếu vậy, hãy thử thay đổi thành x86 (đây là những gì tôi đã làm và đã làm việc).

Nếu bạn muốn biên dịch thành x64, tôi nghĩ bạn phải cài đặt "ODP.NET 64 bit binary" (Tôi chưa làm).

0

Điều này phù hợp với tôi.

Đi Trình quản lý xây dựng/cấu hình trong Visual Studio. Kiểm tra cột nền tảng. Tôi đã thay đổi gỡ lỗi từ bất kỳ CPU nào thành x64

Các vấn đề liên quan