NHibernate: запрос коллекции строк (коллекция не была ассоциацией) - PullRequest
1 голос
/ 19 июня 2010

У меня есть этот класс, который я хочу сохранить в NHibernate. Он имеет одну коллекцию, IList, агрегирующую строки, а не экземпляры классов, называемые DestinationCountryCodes.

  public class RoutingRule
  {
      public virtual long Id { get; set; }

      public virtual MessageType MessageType { get; set; }

      public virtual TransportMethod TransportMethod { get; set; }

      public virtual String Sender { get; set; }

      public virtual String Recipient { get; set; }

      public virtual IList<Party> Parties { get; set; }

      public virtual IList<String> DestinationCountryCodes { get; set; }

      public virtual string PickupCountryCode { get; set; }

      public virtual int PostalCodeLowerLimit { get; set; }

      public virtual int PostalCodeUpperLimit { get; set; }

      public virtual IList<DbConnectionEntry> DbConnectionEntries { get; set; }

      public virtual Boolean Ignore { get; set; }

и так далее ....

Вот как выглядит отображение:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
  <class name="FargoGateLib.RoutingRule, FargoGateLib" 
         table="RoutingRules">
    <id name="Id" column="Id">
      <generator class="native" />
    </id>           
    <property name="MessageType" column="MessageType"/>
    <property name="TransportMethod" column="TransportMethod"/>
    <property name="Sender" column="Sender"/>
    <property name="Recipient" column="Recipient"/>
    <!--<property name="DestinationCountryCode" column="DestinationCountryCode"/>-->
    <bag name="DestinationCountryCodes" table="RoutingRuleCountryCodes" lazy="false" cascade="all">
      <key column="RoutingRuleID"/>
      <element column="CountryCode" type="System.String" />
    </bag>          
    <property name="PickupCountryCode" column="PickupCountryCode"/>
    <property name="PostalCodeLowerLimit" column="PostalCodeLowerLimit"/>
    <property name="PostalCodeUpperLimit" column="PostalCodeUpperLimit"/>
    <bag name="Parties" table="RoutingRule_Parties" lazy="false" cascade="save-update">
      <key column="RoutingRuleID"/>
      <many-to-many column="PartyId" class="FargoGateLib.Party, FargoGateLib" />
    </bag>          
    <bag name="DbConnectionEntries" table="RoutingRule_DbConnectionEntries" lazy="false" cascade="save-update">
      <key column="RoutingRuleID"/>
      <many-to-many column="DbConnectionEntryId" class="FargoGateLib.DbConnectionEntry, FargoGateLib" />
    </bag>          
    <property name="Ignore" column="Ignore"/>
  </class>          
</hibernate-mapping>

Обратите внимание, что тип элемента bag установлен на "System.String".

Теперь это работает отлично! NHibernate создает определенные таблицы, и вся информация сохраняется. Проблема в том, что я не могу понять, как сделать запрос, присоединившись к сумке DestinationCountries.

Это моя попытка:

   IList<RoutingRule> routingRules = session.CreateCriteria(typeof(RoutingRule))
                       .Add(Restrictions.Eq("Ignore", false))
                       .Add(Restrictions.Eq("MessageType", MessageType.Booking))
                       .Add(Restrictions.Eq("TransportMethod", transportMethod))
                       .Add(Restrictions.Lt("PostalCodeLowerLimit", zipcode))
                       .Add(Restrictions.Gt("PostalCodeUpperLimit", zipcode))
                       .Add(Restrictions.Eq("PickupCountryCode", pickupCountry))
                       .SetFetchMode("DestinationCountryCodes", FetchMode.Join)
                       .CreateCriteria("DestinationCountryCodes")
                       .Add(Expression.Eq("CountryCode", destCountry))
                       .SetFetchMode("Parties", FetchMode.Eager)
                       .CreateCriteria("Parties")
                       .Add(Expression.Eq("Identifier", customerIdentifier))
                       .List<RoutingRule>(); 

Работает нормально только с присоединением сторон, однако когда я добавляю присоединение DestinationCountries, я получаю следующее сообщение об ошибке:

NHibernate.MappingException: collection was not an association: FargoGateLib.RoutingRule.DestinationCountryCodes

Что дает !? Я действительно не знаю, как написать запрос, чтобы заставить эту работу.

Заранее спасибо за любые советы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...