У меня есть этот класс, который я хочу сохранить в 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
Что дает !? Я действительно не знаю, как написать запрос, чтобы заставить эту работу.
Заранее спасибо за любые советы.