5

私は私のような質問をたくさん見つけましたが、どれも私の問題の解決策を提供しませんでした。

前もって感謝します

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();
            }
        }
}

エラー...{"プロパティを解決できませんでした:Eメール:Domain.User.User"}

スタックトレース...

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)atNHibernate.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 NHibernate.Criterionでの.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuerycriteriaQuery、ICriteria基準、文字列propertyName、オブジェクト値、ICriterion基準)。SimpleExpression.ToSqlString(ICriteria基準、ICriteriaQuery基準クエリ、IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionaryNHibernate.Impl.SessionImpl.List(CriteriaImpl基準、IList結果)のNHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadableパーシスター、CriteriaQueryTranslatorトランスレーター、ISessionFactoryImplementorファクトリー、ICriteria基準、String rootEntityName、IDictionary 2 enabledFilters)の2つのenabledFilters) 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.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase(IInvocation invocation、ITransactiontransaction)のCastle.DynamicProxy.AbstractInvocation.Proceed()d:\ BuildAgent-03 \ work \ 9844bdf039249947 \ src \ Castle.Facilities.AutoTx \ TransactionInterceptor.cs: 137行目

編集:

わかった。ある程度解決しました。マッピングで、すべてのプロパティとコンポーネントの名前を大文字に変更しました。それ以外の...

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

に設定...

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

そしてそれは動作します。さて、NHibernateがフィールドを介して私のプロパティを入力/読み取りしているという保証はありますか?そうだといい。

4

2 に答える 2

3

これは役立つはずです: getsetで異なる設定に変更します

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

プロパティをマップします。

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

Hibernate は、set に field を使用し、get に Property を使用します。このクエリオーバー:

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

...すぐに動作します

于 2012-12-19T07:04:04.940 に答える
2

マッピングのプロパティの「名前」は、クラスのパブリック仮想プロパティの大文字と小文字が一致する必要があると思います。などに変更<property name="email"...してみてください<property name="Email"...

于 2012-12-19T00:53:03.843 に答える