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
。我在这里发布了一个完整的示例: