2012-03-15 5 views
3

NHibernateマッピングのテストを作成しようとしています。追加する新しいマッピングを自動的に選択してテストします。NHibernate IStatelessSessionまたはISessionからすべてのマップされたエンティティのリストを取得できますか?

現時点では、既知のテストデータベースへのセッションを開くテストがあり、各タイプの最初のエンティティをロードしようとし、nullではないと主張します。

これはすべて正常に動作しますが、新しいエンティティマッピングを追加するたびにテストを更新する必要があります。

マッピングを検査し、マッピングされたエンティティのそれぞれをロードしようとしますが、セッションファクトリが構築されたNHibernate Configurationオブジェクトは私のテストでは見えないので、私は疑問に思っていましたセッションからマッピングされたエンティティのリストにアクセスする方法がありますか、代わりに元の設定を公開する必要がありますか?

+0

ニコライの答え私のマッピング:のそれぞれからのすべてのエラーは、私は 'session.GetSessionImplementation()を呼び出す必要があります。Factory.GetAllClassMetadata()'メタデータを取得します。 – Eamon

答えて

5

SessionからSessionFactoryを取得できます。SessionFactoryにはIClassMetadataのリストを返すGetAllClassMetadata()メソッドがあります。そしてIClassMetadataからMappedClass(GetMappedClass())を得ることができます

しかし、あなたはサブクラスを取得するためにいくつかの余分な作業が必要になります。このコードは、助けることができる:

var metaData = this.session.SessionFactory.GetClassMetadata(baseClass); 
if (metaData != null && metaData.HasSubclasses) 
{ 
    foreach (string entityName in ((NHibernate.Persister.Entity.IEntityPersister)metaData).EntityMetamodel.SubclassEntityNames) 
    { 
     var metadata = this.session.SessionFactory.GetClassMetadata(entityName); 
     result.Add(metadata.GetMappedClass(EntityMode.Poco)); 
    } 
}  
+0

GetAllClassMetadata()は私が探していたメソッドでした。 – Eamon

0

あなたは、エンティティごとに1つだけの行を持っているならば、あなたは私が構成オブジェクトを公開し、このように私のエンティティのすべてを照会マッピングを行うsession.QueryOver<object>().List();

2

を発行することができます。これは、出力IがIStatelessSessionを使用していますが、正しい方向に私を指摘

[TestMethod()] 
public void AllNHibernateMappingsAreOkay() 
{ 
    bool failed = false; 
    log4net.Config.XmlConfigurator.Configure(); 

    using (ISession session = SessionFactory.GetCurrentSession()) 
    { 
     foreach (var s in SessionFactory.GetConfig().ClassMappings) 
     { 
      try 
      { 
       SessionFactory.GetCurrentSession().CreateQuery(string.Format("from {0} e", s.MappedClass.Name)) 
        .SetFirstResult(0).SetMaxResults(50).List(); 
      } 
      catch (Exception ex) 
      { 
       failed = true; 
       log.ErrorFormat("\r\n\r\n {0} \r\n {1} \r\n\r\n", ex.Message, ex.InnerException.Message); 
      } 
     } 
    } 

    Assert.IsFalse(failed, "One or more mappings have errors in them. Please refer to output or logs."); 
} 
+0

ありがとうございましたが、私は設定を公開することを避けようとしていました。 – Eamon

関連する問題