2011-03-25 67 views
2

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

这是可能有一个领域,我可以映射,但它私人使用流利nhibernate ??

+1

您也可以将您的字段设置为受保护的访问器,然后外部类无法看到或设置它,并且不需要扭曲您的Fluent映射。 – ChrisAnnODell 2011-03-25 14:01:03

+0

@ChrisAnnODell - 它不一定是内部的吗?如果仅受保护,映射类将如何看待它? – 2011-03-25 14:18:35

+0

映射类只使用属性来定义映射,而不会尝试访问它们。 ['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

回答

7

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

Map(Reveal.Member<string>("privateProperty")) 
3

我认为this是你在找什么。

流利的映射私有财产

有许多人争论的焦点为 功能NHibernate的一些用户因为 开始,而这对保护性缺乏 映射的私有方法和 他们的域名为 个实体。

问题从我们使用的λ 表达式 您的实体,功能NHibernate的吸引力 属性之一的静态反射的茎;通过 利用表达式我们能够 保护您的映射免受重构 副作用。但是,lambda 表达式只能引用 对象上的公共属性,因此难以使用 对保护或私有属性的使用。

我们的解决方案都不是 理想,我们会第一个承认 那个;但考虑流利的 NHibernate的设计初衷不 支持这些情况,和 限制C#强加给我们,我们已经 得到了一些非常合理的选择。 每个选项都有自己的 妥协,所以重要的是你选择了 妥协的方法,你更愿意接受 ;我将概述每种方法的优缺点 。

+0

今天这篇文章中的所有内容都是可能的,或者这是一个向社区提供的提案列表选项。它是否支持它今天? – leora 2011-03-25 12:50:34

+0

看来,该页面上的所有技术都可以在今天使用。是什么让你质疑今天你是否可以实现这些模式? – SquidScareMe 2011-03-25 13:21:58

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); 
     }   

    } 

一个重要薄g要记住:不要在属性名称内使用下划线。如:当你使用特定的属性映射参考

public class User: Entity 
    { 
     //... 
     private int role_id; 
    } 

功能NHibernate不喜欢它。