Pep*_*dez 5 nhibernate domain-driven-design ddd-repositories
我发现了十几个与我类似的问题,但没有一个能解决我的问题.
先感谢您
好,
我有这门课
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()
{ }
}
Run Code Online (Sandbox Code Playgroud)
这是映射......
<?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>
Run Code Online (Sandbox Code Playgroud)
这就是我所说的
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误... {"无法解析属性:电子邮件:Domain.User.User"}
堆栈跟踪...
位于NHibernate.Persister的NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String alias,String propertyName)的NHibernate.Persister.Entity.AbstractEntityPersister.GetSubclassPropertyTableNumber(String propertyPath)中的NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName).位于NHibernate.Criterion的NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria,String propertyName)的NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria subcriteria,String propertyName)中的Entity.AbstractEntityPersister.ToColumns(String alias,String propertyName) NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor上的NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria,ICriteriaQuery criteriaQuery,IDictionary 2 enabledFilters)
at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary2 enabledFilters)中的.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery,ICriteria criteria,String propertyName,Object value,ICriterion critertion)(IOuterJo 2 enabledFilters)
at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary在NHibernate.Impl上的NHibernate.Impl.CriteriaImpl.List(IList结果)的NHibernate.Impl.SessionImpl.List(CriteriaImpl标准,IList结果)中的inLoadable persister,CriteriaQueryTranslator转换器,ISessionFactoryImplementor工厂,ICriteria标准,String rootEntityName,IDictionary 2 enabledFilters)1.SingleOrDefault()
at NHibernate.Criterion.QueryOver位于E:\ Projects\DataObjects.NHibernate\UserRepository.cs:Castle的第26行的DataObjects.NHibernate.UserRepository.FindByEmail(String emailAddress)中的NHibernate.Criterion.QueryOver 1.NHibernate.IQueryOver.SingleOrDefault()的.CriteriaImpl.UniqueResultT.位于D:\ BuildAgent-03\work\9844bdf039249947\src \中Castle.Facilities.AutoTx.TransactionInterceptor.SynchronizedCase(IInvocation调用,ITransaction事务)的Castle.DynamicProxy.AbstractInvocation.Proceed()中的Proxies.Invocations.IUserRepository_FindByEmail.InvokeMethodOnTarget() Castle.Facilities.AutoTx\TransactionInterceptor.cs:第137行
编辑:
好.在某种程度上解决了.我在映射中将所有属性和组件名称更改为大写.代替...
<property name="email" column="emailaddress" />
Run Code Online (Sandbox Code Playgroud)
把它设置为......
<property name="Email" column="emailaddress" />
Run Code Online (Sandbox Code Playgroud)
它的工作原理.现在,这是NHibernate通过字段填充/读取我的属性的保证吗?希望如此.
这应该有帮助:将get和set的设置更改为不同
<hibernate-mapping ... default-access="field.camelcase">
Run Code Online (Sandbox Code Playgroud)
并映射属性:
<property name="Email" column="emailaddress" />
Run Code Online (Sandbox Code Playgroud)
NHibernate 将使用字段来设置,使用属性来获取。此查询结束:
return tx.QueryOver<User>()
.Where(u => u.Email == emailAddress)
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
...现在可以工作