2010-04-23 42 views
8

我有以下PersonGender類(我真的不,但例如簡化爲對方瞭解我的點),使用NHibernate(功能NHibernate)我要在數據庫列「GenderId」 [INT]值到受保護的INT _genderId字段映射在我的Person類。我該怎麼做呢?流利的NHibernate映射到私有/受保護字段沒有暴露物業

FYI,映射和域對象是在單獨的組件。

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

我已經發布了一個完整的例子在這裏: http://stackoverflow.com/questions/5432380/using-fluent-nhibernate-is-there-anyway-to-have-a-private-property-mapped – 2013-02-16 00:22:28

回答

4

只是使其成爲受保護的財產。 NH反射不需要公共財產。

protected virtual int _genderId { get; set; }

然後映射像這樣(抱歉從來沒有抽時間去流利)...

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

也可能更容易只是映射枚舉。您可以將列存儲爲Enum值或文本。大量的例子。

15

正如dotjoe說,我認爲你需要公開爲保護財產。然後你可以使用Reveal映射到它。

你的類/映射可能會看起來沿

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


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

行也有類似的問題herehere是否有幫助。

+2

FYI對於那些通過Google來到這裏的人:'Reveal.Property'已被棄用。改用'Reveal.Member'。 – 2011-11-17 18:00:01

+0

@CharlieKilian:修正,謝謝! – R0MANARMY 2011-11-17 19:51:57

2

我只使用NHibernate的第一次,但我相信你並不需要爲此創造一個受保護的財產,你只需要在你的映射設置訪問=「字段」,你可以直接映射到私人領域。例如。

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

這種方式對您的域圖層的影響較小。