2010-03-12 14 views
5

Al asignar un hasMany o HasManyToMany en nhibernate fluidez, puede especificar el nombre de la columna a utilizar para la lista como un parámetro para el método asList() de la siguiente manera:¿Es posible especificar el nombre de la propiedad Index para utilizar para las listas en una convención nhibernate fluida?

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

yo preferiría ser capaz de establecer esto usando una convención Fluent NHibernate (ya sea una preexistente o una personalizada), especialmente dado que el nombre predeterminado parece ser "Index", que es una palabra reservada en MSSQL.

He intentado utilizar una convención personalizada que implemente IHasManyConvention, pero el parámetro de instancia no parece contener la información sobre si es una lista, una bolsa o un conjunto, y tampoco contiene los detalles de la columna para el índice columna.

public void Apply(IOneToManyCollectionInstance instance) 
{ 

} 

¿Alguna idea?

Respuesta

1

Cuando se aplica la convención, la asignación subyacente ya se ha generado. Actualmente no hay forma de cambiar esta asignación a una colección ordenada (o de cualquier otro tipo) a través de la convención.

Sin embargo, aún puede cambiar el tipo de colección mediante una IAutoMappingOverride <>, ya que se aplican antes de las convenciones.

Incluso si esto aún no es compatible, parece bastante alto en la lista de Todo para la próxima versión. Vea esto thread para más detalles.

+0

, gracias por su respuesta, sin embargo, las conversaciones de rosca sobre el uso de la convención para especificar que IList debe ser mapeada como una lista en lugar de una bolsa A menos que me falta algo, no menciona nada acerca de especificar una convención para el nombre de columna de la columna de índice – Teevus

+0

@Teevus: No estaba lo suficientemente claro. Lo siento por eso. He actualizado la respuesta en consecuencia. – nulltoken

1

si acaso alguien viene aquí

desde FNH 1.2 es posible cambiar la bolsa a la lista en una convención. Con esto he implementado:

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; 
     } 
    } 
} 
No

perfecto, pero lo suficiente para mi proyecto con un montón de listas

Cuestiones relacionadas