2009-04-21 3 views
0

NHibernate를 사용하여 Northwind 데이터베이스에 연결하려고합니다. 그러나 어떤 이유로 엔티티 유형을로드 할 수 없습니다. NHibernate의 매핑 오류

은 여기에 다음과 같은 오류 메시지가 무엇입니까

<class name="Product" table="Products"> 
    <id name="ProductId" column="ProductId" type="Int32"> 
     <generator class="identity"></generator> 
    </id> 
    <property name="Desc" column="ProductName" type="String" length="60"> 
    </property> 
    </class> 

내 매핑 내 Entity 클래스

public class Product 
    { 
     public virtual Int32 ProductId { get; set; } 
     public virtual String Desc { get; set; } 
    } 

입니다

엔티티를로드 할 수 없습니다 : [OracleLinq.Product # 12 ] [SQL : product0_.ProductId를 ProductId0_0_으로, product0_.ProductName을 ProductN2_0_0_ 제품으로 product0_ WH where product0_.ProductId =?]

여기

at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister) 
    at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId) 
    at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Load(Object id, Object optionalObject, LockMode lockMode, ISessionImplementor session) 
    at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) 
    at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) 
    at NHibernate.Impl.SessionImpl.ImmediateLoad(String entityName, Object id) 
    at NHibernate.Proxy.AbstractLazyInitializer.Initialize() 
    at NHibernate.Proxy.AbstractLazyInitializer.GetImplementation() 
    at NHibernate.Proxy.Poco.Castle.CastleLazyInitializer.Intercept(IInvocation invocation) 
    at Castle.DynamicProxy.AbstractInvocation.Proceed() 
    at ProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value) 
    at OracleLinq.Form1.Form1_Load(Object sender, EventArgs e) 

내가 뭔가 잘못을하고 있습니까 스택 추적을입니까?

+1

예외 내부에 예외가 있습니까? –

+1

일반적으로이 nhibernate 오류가 발생할 때마다 Sql Management Studio에서 SQL (매개 변수가 바뀌 었음)을 복사하여 붙여 넣기를 시도하여 어리석은 짓을하지 않고 열을 잘못 입력했는지 확인합니다. – Min

답변

0

연결 문자열의 기본값이 올바른 데이터베이스입니까? 확인이이 실제로에만 삽입 문제한다

+0

예. DB 연결을 열 수 있습니다. 여기에 내가 사용하는 코드가 있습니다. 구성 cfg = new Configuration(); cfg.Configure(); cfg.AddAssembly (typeof (Product) .Assembly); ISessionFactory sessionFactory = cfg.BuildSessionFactory(); IDbConnection conn = 새 SqlConnection (@ "데이터 원본 = (로컬), 초기 카탈로그 = Northwind, 통합 보안 = SSPI;"); 세션 세션 = sessionFactory.OpenSession (conn); 제품 제품 = (제품) session.Load (typeof (Product), 12); product.Desc = ""; – Seshan

+0

HBM 파일을 컴파일 할 때 어셈블리에 포함되도록 설정 했습니까? –

+0

예 빌드 작업을 포함 리소스로 설정했습니다. – Seshan

0

초기 카탈로그 = [여기 DB 이름],하지만 당신은 또한 그것으로 문제 얻을 수 :

내가 생각

"정체성"오라클에 의해 지원되지 않습니다, 그것은 SqlServer 기능 (자동 계산 기본 키)입니다. 오라클은 시퀀스를 사용합니다.

<id name="ProductId" column="ProductId" type="Int32"> 
    <generator class="sequence"> 
    <param name="sequence">product_seq</param> 
    </generator> 
</id> 

또는 다른 아이디 생성기 (존재해야 시퀀스의 이름을 확인) 다음보십시오. Hilo 또는 Guid는 흥미로운 대안입니다. http://barchitect.blogspot.com/2008/07/nhibernate-generator-and-primary-key.html

+0

아니오 Oracle의 Sequence 열에서도 오류가 발생합니다. 오류는 Generator가 원시 또는 ID 또는 hilo 또는 guid 인 SQL Northwind 데이터베이스에서도 발생합니다. – Seshan

1

두 번째 시도를 참조하십시오

가 여기에 귀하의 의견에서 당신을 구성, 그냥 읽기 쉽 :

Configuration cfg = new Configuration(); 
cfg.Configure(); 
cfg.AddAssembly(typeof(Product).Assembly); 
ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 

IDbConnection conn = new SqlConnection(@"Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI;"); 
ISession session = sessionFactory.OpenSession(conn); 

Product product = (Product)session.Load(typeof(Product), 12); 
product.Desc = ""; 

NHibernate에 맵핑 파일이 분명하다, 그것은 쿼리를 생성 할 수 없었다.

그것은 데이터베이스가하지

  • 일 수 있었다 : 당신이 이미 체크.
  • 테이블이 없습니다 : (동일한 연결 문자열을 사용하여) SQL 콘솔을 열고 오류 메시지의 sql을 복사하여 붙여 넣으십시오. 작동합니까?
  • 연결이을 열어되지 않습니다 bollow
  • 난 당신이 연결을 직접 열 필요가 있다고 생각

를 참조하십시오. 심지어 당신은 NHibernate가 연결을 생성하고 관리하게한다.

이 시도 :

Configuration cfg = new Configuration(); 
cfg.Configure(); 
cfg.AddAssembly(typeof(Product).Assembly); 
ISessionFactory sessionFactory = cfg.BuildSessionFactory(); 

ISession session = sessionFactory.OpenSession(); 

Product product = (Product)session.Load(typeof(Product), 12); 
product.Desc = ""; 

을 커넥트이 스택 트레이스에서 nhibernate.cfg.xml

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property> 
<property name="connection.connection_string"> 
Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI; 
</property> 
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> 
0

로 이동, 난 당신이 '제품 설명을 설정할 때 오류가 발생 의미, ProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value) 참조 '속성. 이것은 NHibernate가 데이터베이스로부터 제품을로드하려고 시도하는 순간이다.

데이터베이스에는 Session.Load에 제공 한 ID를 가진 제품이 없습니다. Session.Get을 사용하면 아마도 null이됩니다.