如何将自定义比较器的排序添加到Fluent nHibernate集合映射中
我需要使用Fluent nHibernate来重写下面的集合映射。
<set name="Contracts" sort="ContractComparer, ActualsModels" inverse="false" lazy="true" cascade="all">
<key column="EV_PROJECT_LEDGER_KEY"/>
<one-to-many class="Contract"/>
</set>
具体而言,我不知道如何使用自定义比较器类映射sort="ContractComparer, ActualsModels"
属性。 这是我到目前为止:
HasMany(x => x.Contracts)
.Cascade.All()
.OrderBy("CONTRACT_ID")
.KeyColumn("EV_PROJECT_LEDGER_KEY");
OrderBy只对直接来自数据库的数据进行排序,但是我需要在添加新元素之后仍然对集合进行排序。 我可以通过使用上面粘贴的.hbm映射来实现这一点,但是我想转到专门使用Fluent映射。
我最终改变了使用List而不是Set的集合。 然后我将下面的函数添加到我的实体类中,以正确的顺序插入新项目。
/// <summary>
/// Inserts inContract and maintains order by ContractId
/// Does not allow duplicates (assuming list is ordered)
/// </summary>
/// <param name="inContract">Contract to insert</param>
/// <returns>True if add was successful and false otherwise</returns>
public virtual bool AddContract(Contract inContract)
{
ContractComparer contractComparer = new ContractComparer();
for (int i = 0; i < myContracts.Count; i++)
{
int compareVal = contractComparer.Compare(inContract, myContracts[i]);
if (compareVal == 0)
{
return false;
}
//catches case where contract should be inserted at the end of the list
if (i == myContracts.Count - 1)
{
myContracts.Add(inContract);
return true;
}
if (compareVal > 0) continue;
myContracts.Insert(i, inContract);
return true;
}
return false;
}
Fluent映射中的OrderBy确保列表从数据库中排序。
HasMany(x => x.Contracts)
.Cascade.AllDeleteOrphan()
.OrderBy("CONTRACT_ID")
.KeyColumn("EV_PROJECT_LEDGER_KEY");
虽然这工作,但我确实喜欢通过传递自定义比较类的hbm.xml映射文件允许的排序属性,因为它保留了顺序并且不允许重复。
链接地址: http://www.djcxy.com/p/39459.html上一篇: How to add sort with custom comparer to Fluent nHibernate collection mapping