Свободная карта NHibernate для частного / защищенного поля, которое не имеет выставляющего свойства - PullRequest
8 голосов
/ 24 апреля 2010

У меня есть следующие классы Person и Gender (не совсем, но пример упрощен, чтобы донести свою точку зрения), используя NHibernate (Fluent NHibernate), я хочу отобразить столбец базы данных "GenderId "[INT] значение для защищенного поля int _genderId в моем классе 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 ]

15 голосов
/ 24 апреля 2010

Как сказал dotjoe, я думаю, вам нужно выставить его как защищенное свойство. Тогда вы можете добраться до него, используя отображение Reveal .

Ваш класс / карта, вероятно, будет выглядеть примерно так:

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


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

Есть также похожие вопросы здесь и здесь , если это поможет.

4 голосов
/ 24 апреля 2010

просто сделайте его охраняемым объектом. Отражение NH не требует публичной собственности.

protected virtual int _genderId { get; set; }

тогда карта, как так (извините, не удосужился свободно) ...

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

также, может быть проще просто отобразить перечисление. Вы можете сохранить столбец как значение Enum или текст. Множество примеров этого.

1 голос
/ 28 апреля 2010

Я использую nHibernate только в первый раз, но я считаю, что вам не нужно создавать защищенное свойство для этого, вам просто нужно указать access = "field" в вашем отображении, и вы можете отобразить непосредственно на личное поле. Э.Г.

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

Таким образом, на вашем доменном уровне меньше влияния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...