Hi,

I've been trying to create a user messaging module on our project. I
have two entities that related two database tables. When I create a
criteria like below, the nHibernate throws an ArgumentNullException.
here is my codes and xml schemas:

PS: If I don't include the "UM.RepliedUserMessages" and its sub
properties in this query, there is no problem.

Please advice.

Thanks.

--
Harun Yiğit LEGOZ

// my query method:
public IList<UserMessage> GetUserMessagesByUserID(int userID,
UserMessageBoxType type)
{
ICriteria criteria =
SessionManager.GetSession().CreateCriteria(typeof(UserMessage), "UM");
            criteria.CreateCriteria("UM.UserMessageRecipents", "UMR",
NHibernate.SqlCommand.JoinType.InnerJoin);
            criteria.CreateCriteria("UM.RepliedUserMessages", "RUM",
NHibernate.SqlCommand.JoinType.LeftOuterJoin);
            criteria.CreateCriteria("RUM.UserMessageRecipents",
"RUMR", NHibernate.SqlCommand.JoinType.InnerJoin);
            criteria.CreateCriteria("UM.From", "UMF",
NHibernate.SqlCommand.JoinType.LeftOuterJoin);//gonderen
            criteria.CreateCriteria("UMR.Receive", "MR",
NHibernate.SqlCommand.JoinType.InnerJoin);//alici
            //.SetProjection(Projections.Distinct(Projections.Id()));


            if (type == UserMessageBoxType.Gelen)//bana gelen mesajlar
            {
                DetachedCriteria subQuery =
DetachedCriteria.For<UserMessageRecipent>("UMRSUB");
                subQuery.Add(Expression.EqProperty("UMRSUB.MessageID",
"UM.Id"))
                    .Add(Expression.Eq("UMRSUB.ReceiveUserID",
userID))
                    .SetProjection(Projections.Property("UMRSUB.Id"));

                DetachedCriteria subQueryForReplieds =
DetachedCriteria.For<UserMessageRecipent>("RUMRSUB");
 
subQuery.Add(Expression.EqProperty("RUMRSUB.MessageID", "RUM.Id"))
                    .Add(Expression.Eq("RUMRSUB.ReceiveUserID",
userID))
                    .SetProjection(Projections.Property("RUMRSUB.Id"));

                criteria.Add(Expression.Or(
                                Subqueries.PropertyIn("UMR.Id",
subQuery),
                                Subqueries.PropertyIn("RUMR.Id",
subQueryForReplieds)));
            }
            else if (type == UserMessageBoxType.Giden)//benim
gonderdigim mesajlar
            {

                criteria.Add(Expression.Or(
                                Expression.Eq("UM.FromUserID",
userID),
                                Expression.Eq("RUM.FromUserID",
userID)));
            }

            IList<UserMessage> l = criteria.List<UserMessage>(); //
exception gets here
            return l;
}

// exception stack trace
[ArgumentNullException: Key cannot be null.
Parameter name: key]
   System.Collections.Hashtable.get_Item(Object key) +2909973
   NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String
entityName, Boolean throwIfNotFound) +62
   NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(String
entityName) +53
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetPropertyMapping(String
entityName) +50
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetType(ICriteria
subcriteria, String propertyName) +69
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria
subcriteria, String propertyName) +204
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypedValue(ICriteria
subcriteria, String propertyName, Object value) +252
   NHibernate.Criterion.CriterionUtil.GetTypedValues(ICriteriaQuery
criteriaQuery, ICriteria criteria, IProjection projection, String
propertyName, Object[] values) +162
   NHibernate.Criterion.SimpleExpression.GetTypedValues(ICriteria
criteria, ICriteriaQuery criteriaQuery) +140
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetQueryParameters()
+270
 
NHibernate.Criterion.SubqueryExpression.InitializeInnerQueryAndParameters(ICriteriaQuery
criteriaQuery) +150
   NHibernate.Criterion.SubqueryExpression.ToSqlString(ICriteria
criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
+80
   NHibernate.Criterion.LogicalExpression.ToSqlString(ICriteria
criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
+102
 
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2
enabledFilters) +282
 
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable
persister, CriteriaQueryTranslator translator,
ISessionFactoryImplementor factory, CriteriaImpl criteria, String
rootEntityName, IDictionary`2 enabledFilters) +405
   NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable
persister, ISessionFactoryImplementor factory, CriteriaImpl
rootCriteria, String rootEntityName, IDictionary`2 enabledFilters)
+159
   NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList
results) +293
   NHibernate.Impl.CriteriaImpl.List(IList results) +69
   NHibernate.Impl.CriteriaImpl.List() +114
   Netron.LMS.Persistence.UserRepository.GetUserMessagesByUserID(Int32
userID, UserMessageBoxType type) in C:\Projects\Netron.LMS
\Netron.LMS.Persistence\UserRepository.cs:194
 
Netron.LMS.Business.Service.UserService.GetUserMessagesByUserID(Int32
userID, UserMessageBoxType type) in C:\Projects\Netron.LMS
\Netron.LMS.Business.Service\UserService.cs:228
   Netron.LMS.UI.Portal.Profil.Mesajlar.get_UserMessages() in C:
\Projects\Netron.LMS\Netron.LMS.UI.Portal\Profil\Mesajlar.aspx.cs:82
   Netron.LMS.UI.Portal.Profil.Mesajlar.BindGrid() in C:\Projects
\Netron.LMS\Netron.LMS.UI.Portal\Profil\Mesajlar.aspx.cs:122
   Netron.LMS.UI.Portal.Profil.Mesajlar.Page_Load(Object sender,
EventArgs e) in C:\Projects\Netron.LMS\Netron.LMS.UI.Portal\Profil
\Mesajlar.aspx.cs:94
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,
Object o, Object t, EventArgs e) +15
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object
sender, EventArgs e) +33
   System.Web.UI.Control.OnLoad(EventArgs e) +99
   Spring.Web.UI.Page.OnLoad(EventArgs e) +127
   System.Web.UI.Control.LoadRecursive() +47
   System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+1436


//UserMessage.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Netron.LMS.Business.Domain.UserMessage,
Netron.LMS.Business.Domain" table="UserMessage">
    <id name="Id" type="Int32" unsaved-value="null">
      <column name="MessageID" length="8" sql-type="bigint" not-
null="true" unique="true" index="PK_Message"/>
      <generator class="native" />
    </id>
    <property name="CourseID" type="Int32" insert="true"
update="true">
      <column name="CourseID" length="4" sql-type="int" not-
null="false"/>
    </property>
    <property name="FromUserID" type="Int32" insert="true"
update="true">
      <column name="FromUserID" length="4" sql-type="int" not-
null="true"/>
    </property>
    <property name="Subject" type="String" insert="true"
update="true">
      <column name="Subject" length="150" sql-type="varchar" not-
null="true"/>
    </property>
    <property name="MessageBody" type="String" insert="true"
update="true">
      <column name="MessageBody" length="2000" sql-type="varchar" not-
null="true"/>
    </property>
    <property name="SendDate" type="DateTime" insert="true"
update="true">
      <column name="SendDate" length="4" sql-type="smalldatetime" not-
null="true"/>
    </property>
    <property name="RepliedMessageID" type="Int64" insert="true"
update="true">
      <column name="RepliedMessageID" length="8" sql-type="bigint" not-
null="false"/>
    </property>

    <many-to-one name="Replied"
class="Netron.LMS.Business.Domain.UserMessage,
Netron.LMS.Business.Domain" insert="false" update="false">
      <column name="RepliedMessageID" length="8" sql-type="bigint" not-
null="false" />
    </many-to-one>

    <many-to-one name="Course"
class="Netron.LMS.Business.Domain.Course, Netron.LMS.Business.Domain"
insert="false" update="false">
      <column name="CourseID" length="4" sql-type="int" not-
null="false" />
    </many-to-one>

    <many-to-one name="From" class="Netron.LMS.Business.Domain.User,
Netron.LMS.Business.Domain" insert="false" update="false">
      <column name="FromUserID" length="4" sql-type="int" not-
null="false" />
    </many-to-one>

    <bag name="RepliedUserMessages" inverse="true" lazy="true"
cascade="all-delete-orphan">
      <key column="RepliedMessageID"/>
      <one-to-many class="Netron.LMS.Business.Domain.UserMessage,
Netron.LMS.Business.Domain"/>
    </bag>
    <bag name="UserMessageRecipents" inverse="true" lazy="true"
cascade="all-delete-orphan">
      <key column="MessageID"/>
      <one-to-many
class="Netron.LMS.Business.Domain.UserMessageRecipent,
Netron.LMS.Business.Domain"/>
    </bag>

  </class>
</hibernate-mapping>


//UserMessageReceipent.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
        <class name="Netron.LMS.Business.Domain.UserMessageRecipent,
Netron.LMS.Business.Domain" table="UserMessageRecipent">
                <id name="Id" type="Int32" unsaved-value="null">
                        <column name="MessageRecipentID" length="4" 
sql-type="int" not-
null="true" unique="true" index="PK_MessageRecipent"/>
                        <generator class="native" />
                </id>
                <property name="MessageID" type="Int64" insert="true" 
update="true">
                        <column name="MessageID" length="8" sql-type="bigint" 
not-
null="true"/>
                </property>
                <property name="ReceiveUserID" type="Int32" insert="true"
update="true">
                        <column name="ReceiveUserID" length="4" sql-type="int" 
not-
null="true"/>
                </property>
                <property name="ReadDate" type="DateTime" insert="true"
update="true">
                        <column name="ReadDate" length="4" 
sql-type="smalldatetime" not-
null="false"/>
                </property>

                <many-to-one name="UserMessage"
class="Netron.LMS.Business.Domain.UserMessage,
Netron.LMS.Business.Domain" insert="false" update="false">
                        <column name="MessageID" length="8" sql-type="bigint" 
not-
null="false" />
                </many-to-one>

                <many-to-one name="Receive" 
class="Netron.LMS.Business.Domain.User,
Netron.LMS.Business.Domain" insert="false" update="false">
                        <column name="ReceiveUserID" length="4" sql-type="int" 
not-
null="false" />
                </many-to-one>


        </class>
</hibernate-mapping>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to