是否可以在流畅的nhibernate约定中指定要用于列表的Index属性的名称?

时间:2010-03-12 07:20:23

标签: fluent-nhibernate

在流畅的nhibernate中映射HasMany或HasManyToMany时,您可以指定用于列表的列名作为AsList()方法的参数,如下所示:

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

我更希望能够使用Fluent NHibernate约定(预先存在的约定或自定义约定)来设置它,特别是因为默认名称似乎是“索引”,这是MSSQL中的保留字。

我尝试使用实现IHasManyConvention的自定义约定,但实例参数似乎不包含有关其列表,包或集的信息,也不包含索引列的列详细信息

public void Apply(IOneToManyCollectionInstance instance)
{

}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

应用约定时,已生成基础映射。目前无法通过约定将此映射更改为有序集合(或任何其他类型)。

但是,您仍然可以通过IAutoMappingOverride<>更改集合类型因为它们在公约之前适用。

即使不支持,但在下一版本的Todo列表中看起来相当高。有关详细信息,请参阅此thread

答案 1 :(得分: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;
        }
    }
}

不完美,但足够我的项目有大量的列表