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

时间:2010-04-23 22:54:04

标签: nhibernate fluent-nhibernate

我有以下PersonGender类(我不是真的,但是这个例子已经过简化以得到我的观点),使用NHibernate(Fluent NHibernate)我想映射数据库列“GenderId”[INT]值为_genderId类中受保护的int Person字段。我该怎么做?

仅供参考,映射和域对象位于不同的程序集中。

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();
    }
}

3 个答案:

答案 0 :(得分:15)

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

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

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


public PersonMap : ClassMap<Person>
{  
    public PersonMap()  
    {  
        Map(Reveal.Member<Person>("genderId")) 
    }  
}

如果有帮助,也有类似的问题herehere

答案 1 :(得分:4)

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

protected virtual int _genderId { get; set; }

然后像这样的地图(对不起,从来没有流畅地说)......

<property name="_genderId" column="genderId" />

另外,只是映射枚举可能更容易。您可以将列存储为枚举值或文本。大量的例子。

答案 2 :(得分:1)

我第一次只使用nHibernate,但我相信你不需要为此创建一个受保护的属性,你只需要在你的映射中指定access =“field”,你就可以直接映射到私人领域。 E.g。

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

这样,对您的域图层的影响就会减少。