Fluent NHibernate映射到没有公开属性的私有/受保护字段

Fluent NHibernate映射到没有公开属性的私有/受保护字段,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有以下Person和Gender类(我不是真的,但是为了让大家理解我的观点,这个例子被简化了),使用NHibernate(流利的NHibernate),我想将数据库列“GenderId”[INT]值映射到我的Person类中受保护的INT\u GenderId字段。我该怎么做 仅供参考,映射和域对象位于单独的程序集中 public class Person : Entity { protected int _genderId; public virtual int Id {

我有以下
Person
Gender
类(我不是真的,但是为了让大家理解我的观点,这个例子被简化了),使用NHibernate(流利的NHibernate),我想将数据库列“
GenderId
”[INT]值映射到我的
Person
类中受保护的INT
\u GenderId
字段。我该怎么做

仅供参考,映射和域对象位于单独的程序集中

public class Person : Entity
{
    protected int _genderId;

    public virtual int Id { get; private set; }
    public virtual string Name { get; private set; }

    public virtual Gender Gender
    {
        get { return Gender.FromId(_genderId); }
    }
}

public class Gender : EnumerationBase<Gender>
{
    public static Gender Male
        = new Gender(1, "Male");

    public static Gender Female
        = new Gender(2, "Female");

    private static readonly Gender[] _genders
        = new[] { Male, Female };

    private Gender(int id, string name)
    {
        Id = id;
        Name = name;
    }

    public int Id { get; private set; }
    public string Name { get; private set; }

    public static Gender FromId(int id)
    {
        return _genders.Where(x => x.Id == id).SingleOrDefault();
    }
}
公共类人员:实体
{
受保护的整数;
公共虚拟整数Id{get;private set;}
公共虚拟字符串名称{get;private set;}
公共虚拟性别
{
获取{return-Gender.FromId(_-genderId);}
}
}
公共类性别:EnumerationBase
{
公共静态性别男性
=新性别(1,“男性”);
公共静态性别女性
=新性别(2,“女性”);
私有静态只读性别[]\u性别
=新[]{男性,女性};
私有性别(整数id,字符串名称)
{
Id=Id;
名称=名称;
}
public int Id{get;private set;}
公共字符串名称{get;private set;}
公共静态性别FromId(int-id)
{
返回_genders.Where(x=>x.Id==Id).SingleOrDefault();
}
}

只需将其设置为受保护的属性即可。NH反射不需要公共财产

protectedvirtualint\u genderId{get;set;}

然后像这样映射(对不起,我从来没有用过fluent)


此外,只映射枚举可能更容易。可以将列存储为枚举值或文本。有很多这样的例子。

正如dotjoe所说,我认为您需要将其作为受保护的财产公开。然后,您可以使用映射找到它

您的类/映射可能看起来与

public class Person : Entity
{
    protected int genderId{ get; set; }
}


public PersonMap : ClassMap<Person>
{  
    public PersonMap()  
    {  
        Map(Reveal.Member<Person>("genderId")) 
    }  
}
公共类人员:实体
{
受保护的int-genderId{get;set;}
}
publicpersonmap:ClassMap
{  
公众人物地图()
{  
地图(显示成员(“性别ID”))
}  
}

还有类似的问题,如果有帮助的话。

我只是第一次使用nHibernate,但我相信您不需要为此创建受保护的属性,您只需在映射中指定access=“field”,就可以直接映射到private字段。例如

<property name="_genderId" access="field" column="GenderId"  type="Int32" />


这样对您的域层的影响较小。

供通过Google访问的用户参考:
Reveal.Property
不推荐使用。改为使用
Reveal.Member
。我在这里发布了一个完整的示例: