nhibernate, не удалось разрешить свойство QueryOver только для одной таблицы
Я нашел дюжину вопросов, похожих на мои, но ни один из них не предложил решение моей проблемы.
заранее спасибо
В порядке,
У меня есть этот класс
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();
}
}
}
Ошибка... {"не удалось разрешить свойство: Email of: Domain.User.User"}
Трассировки стека...
в NHibernate.Persister.Entity. Entity.AbstractEntityPersister.ToColumns (псевдоним строки, строковое свойство Name) в NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(подкритерии ICriteria, свойство StringName) в NHibernate.Loader.Criteria.CriteriaNCriteryCriterGameringCriggerCol Заголовок_категории ().CriterionUtil.GetColumnNamesUsingPropertyName (критерии ICriteriaQueryQuery, критерии ICriteria, свойство String propertyName, значение объекта, критерий ICriterion) в NHibernate.Criterion.SimpleExpression.ToSqlString (критерии ICriteria, критерии ICriteriaQueryQueryQueryQuery2 enabledFilters)
at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary
2 enabledFilters) в NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor (IOuterJoinLoadable persister, транслятор CriteriaQueryTranslator, фабрика ISessionFactoryImplementor, критерии ICriteria, строковое rootEntityName, IDictionary2 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.QueryO1.SingleOrDefault()
at NHibernate.Criterion.QueryOver
1.NHibernate. Castle.DynamicProxy.AbstractInvocation.Proceed () в Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase(вызов IInvocation, транзакция ITransaction) в d:\BuildAgent-03\work\9844bdf039249947\src\Castle.Facorto.A линия 137
РЕДАКТИРОВАТЬ:
ХОРОШО. Решено в некоторой степени. Я изменил все свои свойства и имя компонентов на прописную в моем отображении. Вместо...
<property name="email" column="emailaddress" />
установите его в...
<property name="Email" column="emailaddress" />
и это работает. Теперь, это гарантия того, что NHibernate заполняет / читает мои свойства через поля? Я надеюсь, что это так.
2 ответа
Это должно помочь: изменить настройки, чтобы быть разными для получения и установки
<hibernate-mapping ... default-access="field.camelcase">
и сопоставьте свойства:
<property name="Email" column="emailaddress" />
NHibernate будет использовать поле для набора и свойство для получения. Это QueryOver:
return tx.QueryOver<User>()
.Where(u => u.Email == emailAddress)
.SingleOrDefault();
... будет работать сейчас
Я считаю, что "имя" свойств в вашем отображении должно соответствовать общедоступным виртуальным свойствам в вашем классе. Попробуйте изменить <property name="email"...
в <property name="Email"...
и так далее.