NHibernate保护内部vs内部

NHibernate保护内部vs内部,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,在这之前,我需要说明一个事实,我是一个完全的新手,当涉及到nhibernate时,我不知道我不知道什么 我有这样一个用户类: public class nhMembershipUser : MembershipUser { public new virtual Guid ProviderUserKey { get; set; } public new virtual DateTime LastPasswordChangedDate { get; set; } public

在这之前,我需要说明一个事实,我是一个完全的新手,当涉及到nhibernate时,我不知道我不知道什么

我有这样一个用户类:

public class nhMembershipUser : MembershipUser
{
    public new virtual Guid ProviderUserKey { get; set; }
    public new virtual DateTime LastPasswordChangedDate { get; set; }
    public virtual bool IsEnabled { get; set; }
    protected internal virtual byte[] Password { get; set; }
    protected internal virtual string Salt { 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 override 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 class nhMembershipUserMap : ClassMap<nhMembershipUser>
{
    public nhMembershipUserMap()
    {
        Table("Users");
        Id(x => x.ProviderUserKey).Column("UserID");
        Map(x => x.Comment).Nullable().Length(10000);
        Map(x => x.CreationDate).CustomType<UtcDateTimeType>().Not.Nullable();
        Map(x => x.Email).Not.Nullable().Length(250);
        Map(x => x.IsApproved).Default("1");
        Map(x => x.IsLockedOut).Default("0");
        Map(x => x.LastActivityDate).Nullable();
        Map(x => x.LastLockoutDate).Nullable();
        Map(x => x.LastLoginDate).Nullable();
        Map(x => x.LastPasswordChangedDate).Nullable();
        Map(x => x.PasswordQuestion).Nullable().Length(250);
        Map(x => x.ProviderName).Default("").Not.Nullable().Length(250);
        Map(x => x.UserName).Not.Nullable().Length(250);
        Map(x => x.IsEnabled).Default("1").Not.Nullable();
        Map(Reveal.Member<nhMembershipUser>("Password")).Length(260).Nullable();
        Map(Reveal.Member<nhMembershipUser>("Salt")).Length(250).Nullable();
        Map(x => x.FirstName).Length(35).Not.Nullable();
        Map(x => x.LastName).Length(35).Not.Nullable();
        Map(x => x.Application).Length(250).Not.Nullable();
        HasManyToMany(x => x.Roles).ChildKeyColumn("RoleId").ParentKeyColumn("UserId").Cascade.All().Table("UsersToRoles");

    }
}
公共类nhMembershipUser:MembershipUser
{
公共新虚拟Guid ProviderUserKey{get;set;}
公共新虚拟日期时间LastPasswordChangedDate{get;set;}
公共虚拟布尔值已启用{get;set;}
受保护的内部虚拟字节[]密码{get;set;}
受保护的内部虚拟字符串Salt{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟字符串应用程序{get;set;}
公共新虚拟字符串用户名{get;set;}
公共覆盖布尔等值线
{
得到
{
var UnitOfWork=新的nhUnitOfWork();
返回UnitOfWork.UserIsOnline(此);
}
}
公共新虚拟bool islockeout{get;set;}
公共虚拟IList角色{get;set;}
}
。。。还有一个像这样的fluent mapping类:

public class nhMembershipUser : MembershipUser
{
    public new virtual Guid ProviderUserKey { get; set; }
    public new virtual DateTime LastPasswordChangedDate { get; set; }
    public virtual bool IsEnabled { get; set; }
    protected internal virtual byte[] Password { get; set; }
    protected internal virtual string Salt { 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 override 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 class nhMembershipUserMap : ClassMap<nhMembershipUser>
{
    public nhMembershipUserMap()
    {
        Table("Users");
        Id(x => x.ProviderUserKey).Column("UserID");
        Map(x => x.Comment).Nullable().Length(10000);
        Map(x => x.CreationDate).CustomType<UtcDateTimeType>().Not.Nullable();
        Map(x => x.Email).Not.Nullable().Length(250);
        Map(x => x.IsApproved).Default("1");
        Map(x => x.IsLockedOut).Default("0");
        Map(x => x.LastActivityDate).Nullable();
        Map(x => x.LastLockoutDate).Nullable();
        Map(x => x.LastLoginDate).Nullable();
        Map(x => x.LastPasswordChangedDate).Nullable();
        Map(x => x.PasswordQuestion).Nullable().Length(250);
        Map(x => x.ProviderName).Default("").Not.Nullable().Length(250);
        Map(x => x.UserName).Not.Nullable().Length(250);
        Map(x => x.IsEnabled).Default("1").Not.Nullable();
        Map(Reveal.Member<nhMembershipUser>("Password")).Length(260).Nullable();
        Map(Reveal.Member<nhMembershipUser>("Salt")).Length(250).Nullable();
        Map(x => x.FirstName).Length(35).Not.Nullable();
        Map(x => x.LastName).Length(35).Not.Nullable();
        Map(x => x.Application).Length(250).Not.Nullable();
        HasManyToMany(x => x.Roles).ChildKeyColumn("RoleId").ParentKeyColumn("UserId").Cascade.All().Table("UsersToRoles");

    }
}
公共类nhMembershipUserMap:ClassMap
{
公共nhMembershipUserMap()
{
表(“用户”);
Id(x=>x.ProviderUserKey).Column(“UserID”);
Map(x=>x.Comment).Nullable().Length(10000);
Map(x=>x.CreationDate).CustomType().Not.Nullable();
Map(x=>x.Email).Not.Nullable().Length(250);
映射(x=>x.IsApproved)。默认值(“1”);
Map(x=>x.IsLockedOut).Default(“0”);
映射(x=>x.LastActivityDate).Nullable();
Map(x=>x.LastLockoutDate).Nullable();
Map(x=>x.lastloginandate).Nullable();
Map(x=>x.LastPasswordChangedDate).Nullable();
Map(x=>x.PasswordQuestion).Nullable().Length(250);
Map(x=>x.ProviderName).Default(“”).Not.Nullable().Length(250);
Map(x=>x.UserName).Not.Nullable().Length(250);
Map(x=>x.IsEnabled).Default(“1”).Not.Nullable();
Map(启示.Member(“密码”)).Length(260).Nullable();
Map(leaver.Member(“Salt”)).Length(250).Nullable();
Map(x=>x.FirstName).Length(35).Not.Nullable();
Map(x=>x.LastName).Length(35).Not.Nullable();
Map(x=>x.Application).Length(250).Not.Nullable();
HasManyToMany(x=>x.Roles).ChildKeyColumn(“RoleId”).ParentKeyColumn(“UserId”).Cascade.All().Table(“UsersToRoles”);
}
}
这是构建的,但当然我不能在类之外获取或设置Salt或Password属性,这是伪造的。我试图保持我的用户类轻量级和POCO-ish,并在我的成员资格提供者中构建satting和hash功能;我真的不希望公众能够访问,但我希望我的提供者类能够访问。显而易见的答案是使用内部访问修饰符,但当我在没有受保护修饰符的情况下这样做时,NH会对我咆哮,这违背了目的


如何让程序集中的另一个类访问这些受限属性并保存到NHibernate?这似乎很容易做到。

您在哪个程序集中是“成员资格提供者”?与nhMembershipUser相同?是。相同的程序集,但NH的受保护修改器要求严重限制了我的风格。nhibernate可以使用它吗?事实上,这并不适合我要做的事情。首先,它确实使我的类大大减少了POCO-ish,其次,它意味着我必须将所有机制都放在用户对象中。。。太糟糕了。如果你不喜欢的话,我会怎么做呢。然而,您的意思是更少的DTO ish(仅数据),因为它仍然不知道持久性和计算散列的机制。你的IsOnline也与POCOField setter相矛盾,而不是公共财产setter是解决问题的方法,但我在最后一次回答时被击倒了,所以我只做评论;)@菲罗,对不起,我不想批评你。。。并不是说你的代码不好,只是我的选择。关于IsOnline的事情你说得很对,但是我试图覆盖它的默认行为(从
MembershipUser
类),所以我没有太多选择。。。看起来我有一些似乎不存在的选择。
public class nhMembershipUser : MembershipUser
{
    private byte[] PasswordHash;
    private string Salt;

    public void SetPassword(ICredentialsProvider provider)
    {
        PasswordHash = provider.GetHash(this);
        Salt = provider.GetSalt(this);
    }
}