使用流利的nhibernate,无论如何都有一个私有属性映射

我有一个字段,我想映射,因为它链接到数据库中的列,但我不希望任何外部类直接从我的代码访问此字段(它仅用于私人计算)。

这可能有一个我可以映射的字段,但它使用流利的nhibernate私有?

对的,这是可能的。 您可以使用Reveal.Member静态方法映射私有或隐藏属性

 Map(Reveal.Member("privateProperty")) 

我想这就是你要找的东西。

Fluent映射私有属性

从一开始就有一些Fluent NHibernate用户争论,这就是缺乏在域实体上映射私有和受保护属性的方法。

这个问题源于我们使用lambda表达式来静态反映你的实体,这是Fluent NHibernate的一个吸引人的特性; 通过利用表达式,我们能够保护您的映射免受重构的副作用。 但是,lambda表达式只能引用对象上公共的属性,因此很难用于受保护或私有属性。

我们所拥有的解决方案都不是理想的,我们将是第一个承认这一点的人; 但是考虑到Fluent NHibernate从未被设计为支持这些情况,并且C#对我们施加的限制,我们有一些非常合理的选择。 每个选项都有自己的妥协,因此选择具有您更愿意接受的妥协的方法非常重要; 我将概述每种方法的优缺点。

这是我项目的一个例子。 我的域类只有公共属性。 没有二传手。 该对象是通过构造函数创建的,并且使用方法操作数据。

实体

 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 { public UserMap() { Table("user"); // Reveal private attributes and map them Id(Reveal.Member("_id")).Column("id"); Map(Reveal.Member("_username")).Column("username"); Map(Reveal.Member("_openid")).Column("openid_claimed_identifier"); Map(Reveal.Member("_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, 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不喜欢它。