我正在使用nhibernate构建自己的成员资格提供程序。在使用nhibernate映射时,MembershipUser类是一个非常困难的事情,主要是我认为因为基本属性和方法并非都是虚拟的。我的用户类定义为:
public class nhMembershipUser : MembershipUser
{
public new virtual Guid ProviderUserKey { get; set; }
public new virtual DateTime LastPasswordChangedDate { get; set; }
public virtual bool IsEnabled { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Application { get; set; }
public new virtual string UserName { get; set; }
public new virtual bool IsOnline
{
get
{
var UnitOfWork = new nhUnitOfWork();
return UnitOfWork.UserIsOnline(this);
}
}
public new virtual bool IsLockedOut { get; set; }
public virtual IList<nhRole> Roles { get; set; }
public new virtual bool ChangePassword(string oldPassword, string newPassword)
{
throw new NotSupportedException();
}
public new virtual bool ChangePasswordQuestionAndAnswer(string password, string newPasswordQuestion, string newPasswordAnswer)
{
throw new NotSupportedException();
}
public new virtual string ResetPassword()
{
throw new NotSupportedException();
}
public new virtual string ResetPassword(string passwordAnswer)
{
throw new NotSupportedException();
}
public new virtual string GetPassword()
{
throw new NotSupportedException();
}
public new virtual string GetPassword(string passwordAnswer)
{
throw new NotSupportedException();
}
}
当我试图创建我的映射时,我得到了这个:
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete conf
iguration was used while creating a SessionFactory. Check PotentialReasons colle
ction, and InnerException for more detail.
* Database was not configured through Database method.
---> NHibernate.InvalidProxyTypeException: The following types may not be used
as proxies:
nhApplicationServicesProvider.Entities.nhMembershipUser: method Update should be
'public/protected virtual' or 'protected internal virtual'
nhApplicationServicesProvider.Entities.nhMembershipUser: method GetPassword shou
ld be 'public/protected virtual' or 'protected internal virtual'
nhApplicationServicesProvider.Entities.nhMembershipUser: method ChangePassword s
hould be 'public/protected virtual' or 'protected internal virtual'
nhApplicationServicesProvider.Entities.nhMembershipUser: method ResetPassword sh
ould be 'public/protected virtual' or 'protected internal virtual'
nhApplicationServicesProvider.Entities.nhRole: method set_RoleId should be 'publ
ic/protected virtual' or 'protected internal virtual'
nhApplicationServicesProvider.Entities.nhRole: method set_Name should be 'public
/protected virtual' or 'protected internal virtual'
at NHibernate.Cfg.Configuration.ValidateEntities()
at NHibernate.Cfg.Configuration.Validate()
at NHibernate.Cfg.Configuration.BuildSessionFactory()
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Build
s\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 227
--- End of inner exception stack trace ---
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in d:\Build
s\FluentNH-v1.x-nh3\src\FluentNHibernate\Cfg\FluentConfiguration.cs:line 232
at nhApplicationServicesProvider.nhSessionFactory.CreateDatabaseSchema() in C
:\Users\JHolovacs\Documents\Projects\nhApplicationServicesProvider\nhApplication
ServicesProvider\nhSessionFactory.cs:line 63
at nhApplicationServicesProvider.Program.Main() in C:\Users\JHolovacs\Documen
ts\Projects\nhApplicationServicesProvider\nhApplicationServicesProvider\Program.
cs:line 13
* Database was not configured through Database method.
它特别提到了GetPassword(),ChangePassword()和ResetPassword(),据我所知,这些都是用虚方法正确覆盖基类。
为什么我会收到这些错误,如何解决这个问题?
答案 0 :(得分:2)
它特别提到了GetPassword(),ChangePassword()和ResetPassword(),据我所知,这些都是用虚方法正确覆盖基类。
不,你没有覆盖这些方法,你只是隐藏了它们。
NHibernate要求所有非私有属性和方法都是虚拟的,否则它就没有机会拦截代理上的调用。
如果您不需要延迟加载该类,只需使用lazy="false"
映射您的实体,您将不再需要虚拟成员。如果您需要延迟加载,可以使用proxy="ProxyInterface"
的代理接口。
答案 1 :(得分:0)
前一段时间我有类似的需求,并使用this article on CodeProject作为模板。它看起来效果很好。
我认为关键是不要继承您的域对象中的MembershipUser,而是提供一种在域用户和会员用户之间进行翻译的方法(我不相信我改变了这个功能):
public MembershipUser GetMembershipUserFromUser (User usr) {
MembershipUser u = new MembershipUser (this.Name, usr.Username, usr.Id, usr.Email, usr.PasswordQuestion, usr.Comment, usr.IsApproved, usr.IsLockedOut, usr.CreationDate, usr.LastLoginDate,
usr.LastActivityDate, usr.LastPasswordChangedDate, usr.LastLockedOutDate);
return u;
}