Как реализовать отображение.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; }