Используйте таймеры высокого разрешения, доступные в winmm.lib. См. это для примера.
Да, это из-за inverse = true, альтернативным решением было бы использовать набор или мешок вместо списка с order = "ListOrder", добавьте столбец ListOrder в качестве свойства в класс MyClass с пустым сеттером и получателем, который всегда возвращает его индекс из родительской дочерней коллекции. Нравится:
<class name="MyClass">
<id name="Id">
<generator class="native"/>
</id>
<bag name="Children" cascade="delete" inverse="true" order-by="ListOrder">
<key column="ParentId"/>
<one-to-many class="MyClass"/>
</bag>
<property name="ListOrder" column="ListOrder"/>
<many-to-one name="Parent" class="MyClass" column="ParentId"/>
</class>
и класс
public class MyClass
{
public virtual int ID { get; set; }
public virtual IList<MyClass> Children { get; set; }
public virtual MyClass Parent { get; set; }
public virtual int ListOrder
{
get
{
if (Parent == null || !Parent.Children.Contains(this)) return -1;
return Parent.Children.IndexOf(this);
}
set { }
}
}