2009-03-31 13 views
2

次の設定で何が問題になっていますか? AutoPersistanceModelのWhereフィルタが機能していないように見え、テーブル名の規則も機能していないようです。 "urn:nhibernate-mapping-2.2"の要素 'class'は、名前空間 'urn:nhibernate-mapping-2.2'で無効な子要素 'property'を持っています。 'urn:nhibernate-mapping-2.2'の 'meta、jcs-cache、cache、id、composite-id'ここに私のコードは次のとおりです。このFluent NHibernate Configurationで何が問題になっていますか?

public ISessionFactory BuildSessionFactory() 
    { 
     return Fluently.Configure() 
      .Database(
       OracleConfiguration.Oracle9.ConnectionString(
       c => c.FromConnectionStringWithKey("ConnectionString"))) 
      .Mappings(m => 
          { 
           m.AutoMappings.Add(GetAutoPersistanceModel); 
           m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()); 
          }) 
      .BuildSessionFactory(); 
    } 

    public AutoPersistenceModel GetAutoPersistanceModel() 
    { 
     return AutoPersistenceModel.MapEntitiesFromAssemblyOf<User>() 
      .Where(type => type.IsClass && !type.IsAbstract && type.Namespace == "Some.Namespace") 
      .ConventionDiscovery.Add<IConvention>(
       Table.Is(x => "tbl" + x.EntityType.Name.Pluralize()) 
      ); 
    } 

答えて

1

ジェームズは正しくあなたを導いていますが、彼のスニペットは間違っています。

.WithSetup(s=> s.FindIdentity = p => p.Name == "ID")); 

あなたは何ですか?あなたの実際の財産であるものと "ID"を置き換えてください。

6

例外はNHibernateのは無効である第一<property />要素を、遭遇したと言っています。 NHibernateのhbmファイルの最初の要素は常に(ほぼ)IDであるべきですので、AutoPersistenceModelがあなたの識別子を見つけられないようです。

あなたのIDはどのようにエンティティに指定されていますか? AutoPersistenceModelはそれらが文字通りIdと呼ばれることを期待しています。もしそれらが異なっていれば、それは見つからないでしょう。

AutoPersistenceModelがどのようにIDを検出するかを無効にするには、FindIdentity設定オプションを使用できます。これは、エンティティを変更できない場合に便利です。

// if your Id is EntityId 
.WithSetup(s => 
    s.FindIdentity = property => property.DeclaredType.Name + "Id" 
)