nhibernate, не удалось разрешить свойство QueryOver только одной таблицы

Я нашел дюжину вопросов, похожих на мой, но ни один из них не предложил решения моей проблемы.

заранее спасибо

Ok,

У меня есть этот класс

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"}

Трассировки стека...

в NHibernate.Persister.Entity.AbstractPropertyMapping.ToType (String propertyName) в NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber (String propertyPath) в NHibernate.Persister.Entity.BasicEntity. Entity.AbstractEntityPersister.ToColumns (String псевдоним, String ИмениСвойство) на NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns (ICriteria подкритерий, String ИмениСвойство) на NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection (ICriteria подкритерий, String ИмениСвойство) на NHibernate.Criterion .CriterionUtil.GetColumnNamesUsingPropertyName (критерии ICriteriaQueryQuery, критерии ICriteria, String propertyName, значение объекта, критерий ICriterion) в NHibernate.Criterion.SimpleExpression.ToSqlString (критерии ICriteria, ICriteriaQiberion.ToSqlString. aJoinWalker..ctor (персистер IOuterJoinLoadable, переводчик CriteriaQueryTranslator, фабрика ISessionFactoryImplementor, критерии ICriteria, String rootEntityName, IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary2 enabledFilters) в NHibernate.Impl.SessionImpl.List (критерии CriteriaImpl.Impl. в NHibernate.Impl.CriteriaImpl.UniqueResultT в NHibernate.Criterion.QueryOver1.SingleOrDefault() at NHibernate.Criterion.QueryOver1.NHibernate.IQueryOver.SingleOrDefault () в DataObjects.NHibernate.UserRepository.FindByEmail (String emailAddress) в Data: \ Prosubscribe.ru в Castle.Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget () в Castle.DynamicProxy.AbstractInvocation.Proceed () по адресу Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase (вызов IInvocation \ work44 \ work24, ITnvocation 98 \ work24 \ src \ Castle.Facilities.AutoTx \ TransactionInterceptor.cs: строка 137

РЕДАКТИРОВАТЬ:

В ПОРЯДКЕ. В какой-то степени решено. Я изменил все свои свойства и названия компонентов на заглавные в моем отображении. Вместо...

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

установите его на ...

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

и это работает. Это гарантия того, что NHibernate заполняет / читает мои свойства через поля? Я надеюсь, что это так.


person Pepito Fernandez    schedule 19.12.2012    source источник


Ответы (2)


Это должно помочь: измените настройки, чтобы они были разными для get и set.

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

и сопоставьте свойства:

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

NHibernate будет использовать поле для набора и свойство для получения. Этот QueryOver:

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

... теперь будет работать

person Radim Köhler    schedule 19.12.2012
comment
Привет, Радим, это именно то, что я сделал. Работает нормально. Спасибо - person Pepito Fernandez; 19.12.2012

Я считаю, что «имя» свойств в вашем сопоставлении должно соответствовать случаю общедоступных виртуальных свойств в вашем классе. Попробуйте изменить <property name="email"... на <property name="Email"... и так далее.

person brianpeiris    schedule 19.12.2012
comment
Я думаю, что значение по умолчанию для атрибута доступа по умолчанию в сопоставлении - свойство, но мое говорит поле. Есть ли удобство установить для него свойство и исключить все частные поля из моего класса? - person Pepito Fernandez; 19.12.2012
comment
@Tony - да, это удобно делать автоматическое сопоставление свойств в обход поля, однако учтите, что автоматические свойства могут быть запахом кода. - person eulerfx; 19.12.2012
comment
Я определенно хочу использовать доступ к полю из-за Null Pattern, который я планирую использовать. Кроме того, мне кажется, что идея автоматических свойств не слишком хороша. Я забыл добавить, что я использую подход DDD для написания своего приложения, поэтому объекты домена с сеттерами в их свойствах - НЕТ-НЕТ. - person Pepito Fernandez; 19.12.2012
comment
Вы по-прежнему можете использовать частные сеттеры, NHibernate использует отражение, поэтому он будет работать в любом случае. - person eulerfx; 19.12.2012