2012-12-19 8 views
5

Ich habe ein Dutzend von Frage ähnlich zu mir gefunden, aber keine von ihnen bot eine Lösung für mein Problem.Nhibernate, konnte Eigenschaft nicht auflösen QueryOver nur eine Tabelle

Vielen Dank im Voraus

Ok,

ich diese Klasse

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

dies ist die Abbildung ....

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

haben und das ist, wie ich bin Rufen Sie es an

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

Fehler ... { "konnte nicht Eigentum beheben: E-Mail von: Domain.User.User"}

Stacktrace ...

bei NHibernate.Persister.Entity.AbstractPropertyMapping.ToType (String propertyname) bei NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber (String PropertyPath) bei NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns (String alias, String propertyname) bei NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns (String alias, String propertyName) um NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns (ICriteria Subkriterien, String property) bei NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection (ICriteria Subkriterien, String property) bei NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName (ICriteriaQuery criteriaQuery, ICriteria Kriterien, String propertyname, Objektwert, ICriterion critertion) bei NHibernate.Criterion.SimpleExpression.ToSqlString (ICriteria Kriterien ICriteriaQuery criteriaQuery, IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary 2 enabledFilters) bei NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor (IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor Factory, ICriteria-Kriterien, String rootEntityName, IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary 2 enabledFilters) bei NHibe rnate.Impl.SessionImpl.List (CriteriaImpl Kriterien, IList Ergebnisse) bei NHibernate.Impl.CriteriaImpl.List (IList Treffer) bei NHibernate.Impl.CriteriaImpl.UniqueResultT bei NHibernate.Criterion.QueryOver 1.SingleOrDefault() at NHibernate.Criterion.QueryOver 1.NHibernate.IQueryOver. SingleOrDefault() bei DataObjects.NHibernate.UserRepository.FindByEmail (String emailaddress) in E: \ Projects \ DataObjects.NHibernate \ UserRepository.cs: Zeile 26 bei Castle.Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget() bei Castle.DynamicProxy .AbstractInvocation.Proceed() bei Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase (IInvocation-Aufruf, ITransaction-Transaktion) in d: \ BuildAgent-03 \ work \ 9844bdf039249947 \ src \ Castle.Facilities.AutoTx \ TransactionInterceptor.cs: Zeile 137

EDIT:

OK. Gelöst in gewissem Maße. Ich habe alle meine Eigenschaften und Komponenten in Großbuchstaben in meinem Mapping geändert. Statt ...

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

Set es zu ...

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

und es funktioniert. Ist das nun eine Garantie, dass NHibernate meine Eigenschaften über die Felder auffüllt/liest? Ich hoffe es.

Antwort

3

Dies sollte helfen: Ändern Sie die Einstellungen anders zu sein für bekommen und gesetzt

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

und ordnen Sie die Eigenschaften:

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

NHibernate für Satz verwenden Feld und dem Objekt für bekommen. Diese QueryOver:

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

... arbeiten jetzt

+0

Hallo Radim, genau das habe ich gemacht. Es funktioniert gut. Vielen Dank –

2

Ich glaube, dass der "Name" der Eigenschaften in Ihrem Mapping mit dem Fall der öffentlichen virtuellen Eigenschaften in Ihrer Klasse übereinstimmen sollte. Versuchen Sie, <property name="email"... zu <property name="Email"... und so weiter zu ändern.

+0

Ich denke, der Standardwert für das Standard-Zugriffsattribut in der Mapping-Eigenschaft, aber ich sagt Feld. Gibt es eine Bequemlichkeit, um es auf Eigenschaft zu setzen und alle privaten Felder aus meiner Klasse zu entfernen? –

+0

@Tony - Ja, es ist praktisch, Auto-Property-Mapping zu umgehen, das Feld zu umgehen, aber berücksichtigen Sie, dass [Auto-Eigenschaften können ein Code-Geruch sein] (http://blog.ploeh.dk/2011/05/26/CodeSmellAutomaticProperty. aspx). – eulerfx

+0

Ich möchte auf jeden Fall Feldzugriff wegen Null-Muster verwenden, die ich planen zu verwenden. Auch die Idee von Auto-Eigenschaften klingt für meine Ohren nicht allzu gut. Ich habe vergessen, hinzuzufügen, dass ich einen DDD-Ansatz verwende, um meine Anwendung zu schreiben, so dass Domänenobjekte mit Setter in ihren Eigenschaften ein NO-NO sind. –

Verwandte Themen