2010-03-12 10 views
5

Quando la mappatura di un hasMany o HasManyToMany in NHibernate fluente, è possibile specificare il nome della colonna da utilizzare per la lista come parametro al metodo AsList() come segue:È possibile specificare il nome della proprietà Index da utilizzare per gli elenchi in una convenzione fluente di tipo nhibernate?

HasMany(c => c.Customers) 
    .AsList(c => c.Column("PositionIndex")); 

Io preferirei essere in grado di impostare questo utilizzando una convenzione Fluent NHibernate (sia preesistente che personalizzata), soprattutto perché il nome predefinito sembra essere "Index" che è una parola riservata in MSSQL.

Ho provato a utilizzare una convenzione personalizzata che implementa IHasManyConvention, ma il parametro di istanza non sembra contenere le informazioni relative a un elenco, una borsa o un set e non contiene i dettagli della colonna per l'indice colonna.

public void Apply(IOneToManyCollectionInstance instance) 
{ 

} 

Qualche idea?

risposta

1

Quando la convenzione viene applicata, la mappatura sottostante è già stata generata. Non esiste attualmente alcun modo per modificare questa mappatura in una raccolta ordinata (o qualsiasi altro tipo) tramite convenzione.

Tuttavia, è comunque possibile modificare il tipo di raccolta tramite IAutoMappingOverride <> poiché vengono applicate prima delle convenzioni.

Anche se questo non è ancora supportato, sembra piuttosto in alto nell'elenco Todo per la prossima versione. Vedi questo thread per ulteriori dettagli.

+0

grazie per voi risposta, tuttavia i colloqui filo sull'utilizzo convenzione per specificare che IList dovrebbe essere mappata come una lista invece di una borsa. A meno che non manchi qualcosa, non menziona nulla sulla specifica di una convenzione per il nome della colonna della colonna dell'indice – Teevus

+0

@Teevus: non ero abbastanza chiaro. Perdonami per quello. Ho aggiornato la risposta di conseguenza. – nulltoken

1

nel caso in cui qualcuno viene qui

dal FNH 1.2 è possibile cambiare borsa per elencare in una convenzione. Con che ho implementato:

class CollectionsAreListsConvention : ICollectionConvention 
{ 
    public void Apply(ICollectionInstance instance) 
    { 
     instance.AsList(); 
     instance.Key.Column(instance.EntityType.Name + "_id"); 

     var mapping = (CollectionMapping)instance.GetType() 
      .GetField("mapping", BindingFlags.Instance | BindingFlags.NonPublic) 
      .GetValue(instance); 

     if (!mapping.HasValue(m => m.Index)) 
     { 
      var indexmapping = new IndexMapping(); 

      indexmapping.AddColumn(new ColumnMapping 
      { 
       // for Classes with more than one collection to another Class 
       Name = instance.Member.Name + "_position", 
      }); 

      mapping.Index = indexmapping; 
     } 
    } 
} 
Non

perfetto, ma abbastanza per il mio progetto con tonnellate di liste

Problemi correlati