2009-04-21 12 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> 

私のマッピングがある私のエンティティクラス

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

ある

エンティティをロードできませんでした:[OracleLinq.Product#12 ] [SQL:ProductId0_0_としてproduct0_.ProductIdを選択し、product0_.ProductNameをProductN2_0_0_から製品product0_ 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スタジオのSQL(パラメータが置き換えられた状態)をコピーして貼り付けて、愚かなことや列のスペルミスをしないようにしています。 – Min

答えて

0

接続文字列のデフォルトが正しいデータベースですか?それは挿入時にこれが実際に唯一の問題でなければなりませんが、あなたはまた、それとのトラブルを得ることができる初期カタログ= [ここでDB名]

+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

を持っていることを確認します。私は、「アイデンティティ」がOracleでサポートされていないと思う

、これはSqlServer機能(自動カウントの主キー)です。 Oracleはシーケンスを使用します。

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

またはその他の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

2回目の試行を参照してください:

はここにあなたのコメントからあなたの設定で、単に読みやすくするために:

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に接続を作成して管理させることができます。

これを試してみてください:接続文字は、あなたのスタックトレースで

<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

nhibernate.cfg.xmlに行く

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 = ""; 

、私はProductProxy4c67cf5bf6e640ab82d8c21a90e2a62b.set_Desc(String value)を参照してください、あなたは「DESCを設定するときにエラーが発生したことを意味します'プロパティ。これは、NHibernateがデータベースから製品をロードしようとしている瞬間です。

データベースには、Session.Loadに指定したIDの製品がありません。 Session.Getを使用すると、おそらくnullが返されます。