我有一个字段,我想映射,因为它链接到数据库中的列,但我不希望任何外部类直接从我的这个字段访问代码(仅用于私人计算)。使用流利的nhibernate,有反正有一个私人财产映射
这是可能有一个领域,我可以映射,但它私人使用流利nhibernate ??
我有一个字段,我想映射,因为它链接到数据库中的列,但我不希望任何外部类直接从我的这个字段访问代码(仅用于私人计算)。使用流利的nhibernate,有反正有一个私人财产映射
这是可能有一个领域,我可以映射,但它私人使用流利nhibernate ??
是的,这是可能的。您可以使用Reveal.Member静态方法来映射私有或隐藏属性
Map(Reveal.Member<string>("privateProperty"))
我认为this是你在找什么。
流利的映射私有财产
有许多人争论的焦点为 功能NHibernate的一些用户因为 开始,而这对保护性缺乏 映射的私有方法和 他们的域名为 个实体。
问题从我们使用的λ 表达式 您的实体,功能NHibernate的吸引力 属性之一的静态反射的茎;通过 利用表达式我们能够 保护您的映射免受重构 副作用。但是,lambda 表达式只能引用 对象上的公共属性,因此难以使用 对保护或私有属性的使用。
我们的解决方案都不是 理想,我们会第一个承认 那个;但考虑流利的 NHibernate的设计初衷不 支持这些情况,和 限制C#强加给我们,我们已经 得到了一些非常合理的选择。 每个选项都有自己的 妥协,所以重要的是你选择了 妥协的方法,你更愿意接受 ;我将概述每种方法的优缺点 。
今天这篇文章中的所有内容都是可能的,或者这是一个向社区提供的提案列表选项。它是否支持它今天? – leora 2011-03-25 12:50:34
看来,该页面上的所有技术都可以在今天使用。是什么让你质疑今天你是否可以实现这些模式? – SquidScareMe 2011-03-25 13:21:58
这是我的项目中的一个示例。我的域类只有公共属性。没有二传手。 该对象通过构造函数创建,数据使用方法进行操作。
实体
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);
}
}
一个重要薄g要记住:不要在属性名称内使用下划线。如:当你使用特定的属性映射参考
public class User: Entity
{
//...
private int role_id;
}
功能NHibernate不喜欢它。
您也可以将您的字段设置为受保护的访问器,然后外部类无法看到或设置它,并且不需要扭曲您的Fluent映射。 – ChrisAnnODell 2011-03-25 14:01:03
@ChrisAnnODell - 它不一定是内部的吗?如果仅受保护,映射类将如何看待它? – 2011-03-25 14:18:35
映射类只使用属性来定义映射,而不会尝试访问它们。 ['Internal'](http://msdn.microsoft.com/en-us/library/7c5ka91b(v = vs.80).aspx)会将属性限制为在同一程序集中定义的对象,但nHibernate将从映射类来创建代理[''protected'](http://msdn.microsoft.com/en-us/library/bcd5672a(v = vs.71).aspx)是您需要允许它设置您的存储库中的值。 – ChrisAnnODell 2011-03-25 14:39:18