это работает для меня (извините, если вам не нравится отображение атрибутов - но я думаю, что вы должны понять). Важно указать оба столбца - в противном случае он включал странный столбец (val - что-то вроде строки - забыл точное имя) и использовал его вместо тех, которые я хотел.
[Bag(0, Cascade = "all", Table = "item_hierarchy")]
[Key(1, Column = "child")]
[ManyToMany(2, ClassType = typeof(Item), Column="parent",NotFound = NotFoundMode.Ignore)]
public virtual IList<Item> Parent { get; set; }