我需要检索具有有效Wish
属性的所有用户(因此不为null)。这是我班级的xml:
<class name="Project.Engine.Domain.User,Project.Engine" table="Users" lazy="true">
<id name="UserID" column="UserID">
<generator class="native" />
</id>
<property name="Firstname" column="Firstname" type="string" not-null="true"
length="255" />
<property name="Lastname" column="Lastname" type="string" not-null="true"
length="255" />
<property name="Email" column="Email" type="string" not-null="true"
length="255" />
<one-to-one name="Wish" cascade="all" property-ref="UserID"
class="Project.Engine.Domain.Wish, Project.Engine" />
</class>
获取所有用户的方法如下:
public PagedList<User> GetAll(int pageIndex, int pageSize,
string orderBy, string orderByAscOrDesc)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var users = session.CreateCriteria(typeof(User));
users.Add(Restrictions.IsNotNull("Wish"));
return users.PagedList<User>(session, pageIndex, pageSize);
}
}
您可以注意到,我在子对象上添加了限制。这不能正常工作,因为该方法将所有用户(包括Wish
属性的用户返回为null)。有什么帮助吗?
这是孩子的xml:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Project.Engine.Domain.Wish,Project.Engine" table="Wish" lazy="false">
<id name="WishID" column="WishID">
<generator class="native" />
</id>
<property name="UserID" column="UserID" type="int" not-null="true" length="32" />
<property name="ContentText" column="ContentText" type="string" not-null="false" length="500" />
<property name="Views" column="Views" type="int" not-null="true" length="32" />
<property name="DateEntry" column="DateEntry" type="datetime" not-null="true" />
</class>
</hibernate-mapping>
答案 0 :(得分:1)
嗯,one-to-one
和null
测试可能不存在的方面存在错误。我已经遇到过但忘记了。 property-ref
只是让它更难以诊断,但它确实存在于实际的one-to-one
上。
以下是NHibernate跟踪工具中的相应issue。
解决方法:测试null
的非可空属性的Wish
状态,例如Wish.Views
。
原谅对测试语法的猜测,我不再使用nhibernate-criteria多年了,但请尝试示例:
public PagedList<User> GetAll(int pageIndex, int pageSize,
string orderBy, string orderByAscOrDesc)
{
using (ISession session = NHibernateHelper.OpenSession())
{
var users = session.CreateCriteria(typeof(User));
users.Add(Restrictions.IsNotNull("Wish.Views"));
return users.PagedList<User>(session, pageIndex, pageSize);
}
}
使用linq-to-nhibernate,我确认此解决方法适用于我自己的项目,例如:
// The "TotalAmount != null" seems to never be able to come false from a
// .Net run-time view, but converted to SQL, yes it can, if TransactionRecord
// does not exist.
// Beware, we may try "o.TransactionsRecord != null", but you would get struck
// by https://nhibernate.jira.com/browse/NH-3117 bug.
return q.Where(o => o.TransactionsRecord.TotalAmount != null);
我保留了我的其他答案,因为您可能会考虑使用many-to-one
,尤其是因为您没有进行双向映射({1}}中没有相应的constrained
one-to-one
)除了没有实际的Wish
。 one-to-one
不会受到这个错误的影响。
答案 1 :(得分:0)
one-to-one
的 property-ref
映射不是&#34;实际&#34;一对一,通常这是一个标志,应该使用many-to-one
映射
也许这与你的麻烦无关,但你可以尝试一下。
&#34;实际&#34;一对一使从属表主键等于父表主键。 (在您的情况下,依赖表格Wish
将有一个外国主键,UserId
在您的情况下。请参阅此example。)
我有时间&#34;播放&#34;与&#39;一对一的财产 - 参考&#39;,由于许多问题我总是放弃它。我用更经典的映射替换了它,要么改变我的数据库以实现一对一,要么使用多对一和生活在子端的集合,尽管它总是包含单个元素。