Как реализовать отображение.ChildWhere() с отношением "многие ко многим" в NH 3.2
У меня есть следующее отображение FNH:
public class ItemMap : ClassMap<Item>
{
public ItemMap ()
{
this.HasManyToMany(a => a.ChildItems).ChildWhere("IsDeleted = 0").AsSet();
}
}
Результат hbm файла:
<hibernate-mapping>
<class name="Item" table="Item">
<set name="ChildItems" table="ItemsToChildItems">
...
<many-to-many class="ChildItem" where="IsDeleted = 0">
<column name="ChildItemId" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
Я хочу реализовать то же отображение, используя "сексуальное отображение по коду:-) / конформистский подход" NHibernate 3.2
Примечание: следующий подход не работает:
public class ItemMap : ClassMapping<Item>
{
public ItemMap()
{
this.Set(x => x.ChildItems
, map =>
{
map.Where("IsDeleted = 0");
}
, action => action.ManyToMany());
}
}
Потому что: это следующее отображение FNH:
public class ItemMap : ClassMap<Item>
{
public ItemMap ()
{
this.HasManyToMany(a => a.ChildItems).Where("IsDeleted = 0").AsSet();
}
}
.Where ("IsDeleted = 0") и.ChildWhere("IsDeleted = 0") не совпадают.
HBM различия:
Приведите файл hbm с помощью .ChildWhere("IsDeleted = 0")
является:
<hibernate-mapping>
<class name="Item" table="Item">
<set name="ChildItems" table="ItemsToChildItems">
...
<many-to-many class="ChildItem" where="IsDeleted = 0">
<column name="ChildItemId" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
Приведите файл hbm с помощью .Where("IsDeleted = 0")
является:
<hibernate-mapping>
<class name="Item" table="Item">
<set name="ChildItems" table="ItemsToChildItems" where="IsDeleted = 0">
...
<many-to-many class="ChildItem">
<column name="ChildItemId" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
У кого похожая проблема или можете предложить решение? Нужна помощь.
1 ответ
У меня была такая же проблема, и я нашел решение:
https://nhibernate.jira.com/browse/NH-2997
Решение в 3 этапа:
1) Добавьте новый метод интерфейса в интерфейс IManyToManyMapper:
public interface IManyToManyMapper : IColumnsMapper
{
void Where(string sqlWhereClause);
}
2) Реализовать новый метод в классе ManyToManyCustomizer:
public void Where(string sqlWhereClause)
{
customizersHolder.AddCustomizer(propertyPath, (IManyToManyMapper x) => x.Where(sqlWhereClause));
}
3) Реализовать новый метод в классе ManyToManyMapper:
public void Where(string sqlWhereClause)
{
manyToMany.where = sqlWhereClause;
}