2012-12-19 31 views
5

Benimkine benzer bir düzine soru buldum ama bunların hiçbiri benim sorunuma bir çözüm önermedi. nhibernate, özelliği çözemedi QueryOver sadece bir tablo

....

ben bu sınıfı

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

bu haritalama olduğunu var

Tamam önceden

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

teşekkür ederiz ve bu i buyum çağıran

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

Hata ... { "özelliğini çözemedi: ait Email: Domain.User.User"}

stacktrace ...

NHibernate.Persister.Entity.AbstractPropertyMapping.ToType de (String NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns de NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns de NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber (string propertyPath) de propertyName) (string takma, dize propertyName) (string takma, String propertyName) at NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName de NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns (ICriteria-kriterler, dize propertyName) NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection de (ICriteria alt-kriter, dize propertyName) (ICriteriaQuery criteriaQuery, ICriteria kriterleri, NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor de NHibernate.Criterion.SimpleExpression.ToSqlString de dize propertyName, nesne değeri, ICriterion critertion) (ICriteria kriterleri, ICriteriaQuery criteriaQuery ıdictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary 2 enabledFilters) (IOuterJoinLoadable persister, CriteriaQueryTranslator çevirmen, ISessionFactoryImplementor fabrika, ICriteria ölçütleri, String rootEntityName, IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary 2 enabledFilters) NHIB'de rnate.Impl.SessionImpl.List (CriteriaImpl kriterleri, ılist sonuçlar) NHibernate.Impl.CriteriaImpl.List (ılist sonuçlar) NHibernate.Criterion.QueryOver 1.SingleOrDefault() at NHibernate.Criterion.QueryOver 1.NHibernate.IQueryOver de NHibernate.Impl.CriteriaImpl.UniqueResultT de . E DataObjects.NHibernate.UserRepository.FindByEmail (string emailAddress) de SingleOrDefault() : Castle.Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget (hat 26 ) Castle.DynamicProxy de: \ Projeler \ DataObjects.NHibernate UserRepository.cs \ .AbstractInvocation.Proceed() Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase (IInvocation çağırma, ITransaction işlemi) d: \ BuildAgent-03 \ work \ 9844bdf039249947 \ src \ Castle.Facilities.AutoTx \ TransactionInterceptor.cs: line 137

DÜZENLEME:

Tamam. Bir ölçüde çözüldü. Haritalarımdaki tüm özellikleri ve bileşen isimlerini sermayeye değiştirdim. Yerine ...

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

seti o kadar ... ve çalışır. Şimdi, NHibernate'in mülklerimi alanlarımla doldurduğunu/okuduğunu garanti ediyor mu? Umarım.

cevap

3

Bu yardımcı olacaktır: Farklı olmak ayarlarını değiştirin almak ve

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

set ve özellikleri harita için:

<property name="Email" column="emailaddress" /> 
seti ve Mülkiyet için

NHibernate kullanacağı alan unutmak. Bu QueryOver:

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

... Ben haritalama varsayılan erişim özelliğin varsayılan değeri özellik olduğunu düşünüyorum

+0

Merhaba Radim, Ben de öyle yaptım. İyi çalışıyor. Teşekkürler –

2

Haritanızdaki özelliklerin "adı" nın, sınıfınızdaki genel sanal özelliklerin durumuyla eşleşmesi gerektiğine inanıyorum. <property name="email"...'u <property name="Email"... ve benzeri değiştirmeyi deneyin.

+0

şimdi çalışacaktır, ama mayın tarlasına diyor. Mülkten özel alanlara sahip olmak ve sınıfımdaki tüm özel alanları ortadan kaldırmak için bir kolaylık var mı? –

+0

@Tony - evet, otomatik özellik eşlemesi yapmak için uygun bir özelliktir, ancak [auto-properties bir kod kokusu olabilir] düşünün (http://blog.ploeh.dk/2011/05/26/CodeSmellAutomaticProperty. aspx). – eulerfx

+0

Kullanmayı planladığım Boş Desen nedeniyle kesinlikle saha erişimini kullanmak istiyorum. Ayrıca, otomatik özellikler fikri de benim seslerime pek iyi gelmiyor. Uygulamamı yazmak için bir DDD yaklaşımı kullandığımı eklemeyi unuttum, bu nedenle özelliklerinde setter bulunan etki alanı nesneleri NO-NO'dur. –

İlgili konular