我有以下Person
和Gender
类(我不是真的,但是这个例子已经过简化以得到我的观点),使用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();
}
}
答案 0 :(得分:15)
正如dotjoe所说,我认为您需要将其作为受保护的财产公开。然后你可以使用Reveal映射来实现它。
您的类/映射可能看起来像
public class Person : Entity
{
protected int genderId{ get; set; }
}
public PersonMap : ClassMap<Person>
{
public PersonMap()
{
Map(Reveal.Member<Person>("genderId"))
}
}
答案 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" />
这样,对您的域图层的影响就会减少。