nhibernate,仅一个表无法解析属性QueryOver [英] nhibernate, could not resolve property QueryOver only one table

查看:92
本文介绍了nhibernate,仅一个表无法解析属性QueryOver的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现了十二个与我的问题类似的问题,但是没有一个问题可以解决我的问题.

I have found a dozen of question similar to mine but none of them offered a solution to my problem.

提前谢谢

好吧

我有这堂课

public class User : IEntity
    {
        private int id;
        public virtual int Id { get { return id; } }


        private string email;

        public virtual string Email
        {
            get { return email; }
            //private set { email = value; }
        }

        private string password;

        public virtual string Password
        {
            get { return password; }
            //private set { password = value; }
        }

        private bool isActive;

        public virtual bool IsActive
        {
            get { return isActive; }
            //private set { isActive = value; }
        }

        private bool isRegistered;

        public virtual bool IsRegistered
        {
            get { return isRegistered; }
            //private set { isRegistered = value; }
        }

        private bool hasRequestedApplication;

        public virtual bool HasRequestedApplication
        {
            get { return hasRequestedApplication; }
            //private set { hasRequestedApplication = value; }
        }


        private ContactInfo contactInformation;

        public virtual ContactInfo ContactInformation
        {
            get { return contactInformation; }
            //private set { contactInformation = value; }
        }



        public User(string email)
        {
            this.email = email;
        }

        public User(string email, string password):this(email)
        {
            this.password = password;
        }

        public User()
        { }
}

这是映射....

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain"
                 namespace="Domain.User" default-access="field">

  <class name="User" table="[User]">

    <id name="id" column="UserID">
      <generator class="identity" />
    </id>
    <property name="email" column="Email" not-null="true"></property>
    <property name="password" column="HashedPassword" not-null="false"></property>
    <property name="isRegistered" column="IsRegistered" not-null="true"></property>
    <property name="isActive" column="IsActive" not-null="true"></property>
    <property name="hasRequestedApplication" column="HasRequestedApplication" not-null="true"></property>

    <one-to-one name="contactInformation" class="Domain.User.ContactInfo"/>
  </class>
</hibernate-mapping>

这就是我的称呼方式

 public class UserRepository: IUserRepository
    {
        Func<ISession> session;

        public UserRepository(Func<ISession> _session)
        {
            session = _session;
        }

        [Transaction]
        public User FindByEmail(string emailAddress)
        {
            using (var tx = session())
            {
                return tx.QueryOver<User>().Where(u => u.Email == emailAddress).SingleOrDefault();
            }
        }
}

错误... {无法解析属性:电子邮件:Domain.User.User"}

Error... {"could not resolve property: Email of: Domain.User.User"}

StackTrace ...

StackTrace...

在NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) 在NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber(String propertyPath) 在NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(字符串别名,字符串propertyName) 在NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(字符串别名,字符串propertyName) 在NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria子标准,字符串propertyName) 在NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria子标准,字符串propertyName) 在NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName处(ICriteria查询标准查询,ICriteria标准,字符串propertyName,对象值,ICriterion标准) 在NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria条件,ICriteria查询条件查询,IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary 2 enabledFilters) 在NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable持久性,CriteriaQueryTranslator转换器,ISessionFactoryImplementor工厂,ICriteria标准,字符串rootEntityName,IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary 2 enabledFilters) 在NHibernate.Impl.SessionImpl.List(CriteriaImpl条件,IList结果) 在NHibernate.Impl.CriteriaImpl.List(IList结果) 在NHibernate.Impl.CriteriaImpl.UniqueResultT 在NHibernate.Criterion.QueryOver 1.SingleOrDefault() at NHibernate.Criterion.QueryOver 1.NHibernate.IQueryOver.SingleOrDefault()处 在E:\ Projects \ DataObjects.NHibernate \ UserRepository.cs:第26行中的DataObjects.NHibernate.UserRepository.FindByEmail(String emailAddress) 在Castle.Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget() 在Castle.DynamicProxy.AbstractInvocation.Proceed() 在d:\ BuildAgent-03 \ work \ 9844bdf039249947 \ src \ Castle.Facilities.AutoTx \ TransactionInterceptor.cs:line 137

at NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) at NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber(String propertyPath) at NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String alias, String propertyName) at NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String alias, String propertyName) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria, String propertyName) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName) at NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName, Object value, ICriterion critertion) at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary2 enabledFilters) at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) at NHibernate.Impl.CriteriaImpl.List(IList results) at NHibernate.Impl.CriteriaImpl.UniqueResultT at NHibernate.Criterion.QueryOver1.SingleOrDefault() at NHibernate.Criterion.QueryOver1.NHibernate.IQueryOver.SingleOrDefault() at DataObjects.NHibernate.UserRepository.FindByEmail(String emailAddress) in E:\Projects\DataObjects.NHibernate\UserRepository.cs:line 26 at Castle.Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget() at Castle.DynamicProxy.AbstractInvocation.Proceed() at Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase(IInvocation invocation, ITransaction transaction) in d:\BuildAgent-03\work\9844bdf039249947\src\Castle.Facilities.AutoTx\TransactionInterceptor.cs:line 137

好.在某种程度上解决了.我在映射中将所有属性和组件名称更改为大写. 代替...

OK. Solved to some extent. I changed all my properties and components name to capital in my mapping. Instead of...

<property name="email" column="emailaddress" />

将其设置为...

<property name="Email" column="emailaddress" />

,并且有效.现在,是否可以保证NHibernate通过字段填充/读取我的属性?但愿如此.

and it works. Now, is that a guarantee that NHibernate is populating/reading my properties via the fields? I hope so.

推荐答案

这应该有所帮助:将 get set

This should help: Change the settings to be different for get and set

<hibernate-mapping ... default-access="field.camelcase">

并映射属性:

<property name="Email" column="emailaddress" />

NHibernate将使用set作为字段,使用Property作为get字段.此QueryOver:

NHibernate will use field for set and the Property for get. This QueryOver:

return tx.QueryOver<User>()    
  .Where(u => u.Email == emailAddress)  
  .SingleOrDefault();

...现在可以使用

这篇关于nhibernate,仅一个表无法解析属性QueryOver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆