2009-12-23 50 views
5

有沒有辦法使用SessionFactory.GetClassMetadata()或者其他任何你知道的方法來動態獲取作爲NHibernate類的字符串屬性基礎的varchar列的最大大小?通過NHibernate元數據查找底層列大小

爲了澄清,我不想讀取在NHibernate映射文件中指定的長度屬性。我想推導出實際的數據庫列長度。

回答

1

當生成會話工廠時,NH引擎不檢查(並檢索)底層數據庫是什麼。對於你的情況,你要麼提供一個「豐富的」映射,以便在運行時提供所有的東西,或者創建一個從數據庫讀取必要信息的函數(即,從sql.server的sys.columns中選擇*)需要它。

你要知道,一個豐富的映射也允許NH引擎做一些自動化(如檢查,如果傳遞的字符串的大小比(N)VARCHAR列的長度大)

+0

謝謝,捷豹。通過豐富的映射,您是否意味着包含與數據庫列大小相對應的長度屬性的映射? – 2009-12-24 17:36:33

+0

是 btw評論我的回答會提醒我您的評論。答案不能用於討論 – Jaguar 2010-02-19 17:09:26

6

請參見下面的代碼對於兩種不同的方式,您可以從NHib元數據中獲取字符串的列大小。

乾杯,
Berryl

[Test] 
    public void StringLength_DefaultIs_50_v1() 
    { 
     _metadata = _SessionFactory.GetClassMetadata(typeof(User)); 
     var propertyType = _metadata.GetPropertyType("Email") as StringType; 
     Assert.That(propertyType.SqlType.Length, Is.EqualTo(50)); 
    } 

    [Test] 
    public void StringLength_DefaultIs_50_v2() 
    { 
     var mapping = _Cfg.GetClassMapping(typeof(User)); 
     var col = mapping.Table.GetColumn(new Column("Email")); 
     Assert.That(col.Length, Is.EqualTo(50)); 
    }