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
-~----------~----~----~----~------~----~------~--~---