我有一个字段,我想要映射,因为它链接到数据库中的列,但我不希望任何外部类直接从我的代码访问此字段(它仅用于私人计算)。
这可能有一个我可以映射的字段,但它使用流畅的nhibernate私有吗?
答案 0 :(得分:7)
是的,这是可能的。您可以使用Reveal.Member静态方法映射私有或隐藏属性
Map(Reveal.Member<string>("privateProperty"))
答案 1 :(得分:3)
我认为this正是您所寻找的。 p>
Fluent映射私有属性
有一个争论的焦点 一些Fluent NHibernate的用户从那以后 一开始,这就是缺乏 一种映射私有和。的方法 受保护的域名属性 实体。
问题源于我们对lambda的使用 静态反射的表达式 你的实体,其中一个吸引人的 Fluent NHibernate的性质;通过 利用我们能够表达的表达方式 保护您的映射免受重构 副作用。但是,lambda 表达式只能参考 公开的属性 对象,这样很难 用于保护或私人 属性。
我们没有解决方案 理想,我们将是第一个承认 那;但考虑到Fluent NHibernate从未被设计为 支持这些情况,以及 限制C#强加给我们,我们已经 有一些非常合理的选择。 每个选项都有自己的选项 妥协,所以你很重要 选择有的方法 妥协你更愿意 接受;我将概述优缺点 每种方法。
答案 2 :(得分:0)
这是我项目的一个例子。我的域类只有公共属性。没有二传手。 通过构造函数创建对象,并使用方法操作数据。
<强>实体强>
public class User: Entity
{
private string _openid;
private string _email;
private string _username;
private int roleid;
// needed for mapping
protected User() { }
// your normal constructor
public User(string openid)
{
Validator.NotNull(string openid, "openid is required.");
_openid = openid;
}
public string Email
{
get { return _email; }
}
public string Username
{
get { return _username; }
}
public string Openid
{
get { return _openid; }
}
// Here are some methods
// ...
}
映射类
public class UserMap : ClassMap<User>
{
public UserMap()
{
Table("user");
// Reveal private attributes and map them
Id(Reveal.Member<User>("_id")).Column("id");
Map(Reveal.Member<User>("_username")).Column("username");
Map(Reveal.Member<User>("_openid")).Column("openid_claimed_identifier");
Map(Reveal.Member<User>("_email")).Column("email");
// You need to create this mapping if you want to query using linq,
//see UserRepository below
Map(x => x.Id, "id").ReadOnly();
Map(x => x.Email, "email").ReadOnly();
Map(x => x.Username, "username").ReadOnly();
Map(x => x.Openid, "openid_claimed_identifier").ReadOnly();
}
}
<强>存储库强>
public class UserRepository : Repository<User>, IUserRepository
{
public UserRepository(ISession session)
: base(session)
{
}
public User find_user_by_openid(string openid_claimed)
{
return base.FindBy(x => x.Openid == openid_claimed);
}
public User find_user_by_id(int id)
{
return base.FindBy(x => x.Id == id);
}
}
要记住一件重要的事情:不要在属性名称中使用下划线。如:
public class User: Entity
{
//...
private int role_id;
}
当您使用特定属性映射引用时,Fluent NHibernate不喜欢它。