2011-03-25 66 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不喜歡它。