在流畅的nhibernate中映射HasMany或HasManyToMany时,您可以指定用于列表的列名作为AsList()方法的参数,如下所示:
HasMany(c => c.Customers)
.AsList(c => c.Column("PositionIndex"));
我更希望能够使用Fluent NHibernate约定(预先存在的约定或自定义约定)来设置它,特别是因为默认名称似乎是“索引”,这是MSSQL中的保留字。
我尝试使用实现IHasManyConvention的自定义约定,但实例参数似乎不包含有关其列表,包或集的信息,也不包含索引列的列详细信息
public void Apply(IOneToManyCollectionInstance instance)
{
}
有什么想法吗?
答案 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;
}
}
}
不完美,但足够我的项目有大量的列表