2009-03-31 4 views
2

Was ist falsch an der folgenden Einrichtung? Der Where-Filter für das AutoPersistanceModel scheint nicht zu funktionieren, und die Tabellennamenskonvention scheint ebenfalls nicht zu funktionieren. Der Fehler, den ich gerade bekomme, ist "Das Element 'class' im Namensraum 'urn: nhibernate-mapping-2.2' hat das ungültige Kindelement 'property' im Namensraum 'urn: nhibernate-mapping-2.2'. Liste der möglichen Elemente: 'Meta, JCS-Cache, Cache, ID, Composite-ID' im Namespace 'urn: nhibernate-mapping-2.2'. " Hier ist mein Code:Was ist los mit dieser Fluent NHibernate Konfiguration?

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()) 
      ); 
    } 

Antwort

1

James führt Sie richtig, aber sein Schnipsel ist falsch.

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

Sind Sie auf der Suche? Ersetzen Sie "ID" durch was auch immer Ihre tatsächliche Eigenschaft ist.

6

Die Ausnahme sagt NHibernate ein <property /> Element gestoßen ersten, die ungültig ist. Das erste Element in einer NHibernate-hbm-Datei sollte (fast) immer eine ID sein, daher scheint es, dass AutoPersistenceModel Ihre Kennungen nicht findet.

Wie werden Ihre Ids in Ihren Entitäten benannt? Die AutoPersistenceModel erwartet, dass sie buchstäblich Id genannt werden, wenn sie etwas anderes sind, dann wird es sie nicht finden.

Sie können die Konfigurationsoption FindIdentity verwenden, um die AutoPersistenceModel Ids zu überschreiben, was nützlich sein kann, wenn Sie Ihre Entitäten nicht ändern können.

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