2010-03-12 20 views
5

當映射用流利的NHibernate的一個的hasMany或HasManyToMany,您可以指定列名使用的列表作爲參數傳遞給AsList()方法如下:是否可以指定用於流暢nhibernate約定中的列表的Index屬性的名稱?

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

我寧願可以設置這使用流利的NHibernate約定(既有的或自定義的),尤其是因爲默認名稱是「索引」,這是MSSQL中的保留字。

我試過使用實現IHasManyConvention的自定義約定,但實例參數似乎沒有包含關於它是一個列表,一個包還是一組集合的信息,也沒有包含索引的列詳細信息柱。

public void Apply(IOneToManyCollectionInstance instance) 
{ 

} 

任何想法?

回答

1

正在應用約定時,底層映射已經生成。目前沒有辦法通過慣例將這種映射改變爲有序集合(或任何其他類型)。

但是,您仍然可以通過IAutoMappingOverride> <>更改集合的類型,因爲它們在約定之前應用。

即使這還不被支持,它在下一個版本的待辦事項列表中看起來相當高。有關更多詳細信息,請參見thread

+0

感謝的項目爲你解答,但是關於使用約定指定的IList 應該被映射爲一個列表線程會談,而不是一袋。除非我錯過了一些東西,它沒有提及任何關於爲索引列的列名指定約定的問題 – Teevus 2011-02-03 02:30:32

+0

@Teevus:我還不夠清楚。對不起。我已經相應地更新了答案。 – nulltoken 2011-02-03 15:12:27

1

以防萬一有人來這裏

因爲FNH 1.2有可能改變袋公約列出。有了我實現的:

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

並不完美,但足以讓我用噸名單

相關問題