2010-03-05 69 views
4

我使用流利的NHibernate,並自動映射的類。流利NHibernate和計算屬性

我有一類沿着這是沒有用的屬性的其餘部分映射的

public virtual DateTime? LastActionTimeStamp 
{ 
    get { 
     return Actions.Count == 0 ? null : Actions.OrderByDescending(
      a => a.TimeStamp).ElementAt(0).TimeStamp; 
    } 
} 

線計算的特性,所以在限制的ICriteria我不能使用它。我添加了一個空的制定者(如我讀的地方,這樣做會包括它在映射,它不會),但現在我得到了NHibernate的錯誤:

could not execute query ... Invalid column name 'LastActionTimeStamp'.

所以我的問題是:我該怎麼辦告訴Fluent NHibernate告訴NHibernate忽略該屬性的數據庫,但是仍然返回屬性get的計算值?

回答

2

你可以與物業和使用的公式聯繫起來,代替C#代碼。例如

物業:

private int _postCount = 0; 
public virtual int PostCount 
{ 
    get 
    { 
     return _postCount; 
    } 
} 

公式:

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0) 

然後你就可以在你的表情像往常一樣使用PostCount。請記住在您的FluentMapping屬性中設置訪問修飾符。不知道是什麼流利的支持,但我已經找到了法線貼圖的選項有:

* property 
* field 
* field.camelcase 
* field.camelcase-underscore 
* field.pascalcase-m-underscore 
* field.lowercase-underscore 
* nosetter.camelcase 
* nosetter.camelcase-underscore 
* nosetter.pascalcase-m-underscore 
* nosetter.lowercase-underscore 

可能是最好檢查出的正式名單Access Strategies NHibernate的文檔,以便您的命名策略相結合的訪問策略如「field.lowercase下劃線」

1

我不確定你可以用NHibernate做到這一點,但我可能是錯的。 NHibernate將您的標準轉換爲SQL,因此該屬性將無法用於查詢(它不在db!中)。

但是,如果我錯了(那很頻繁),你應該能夠用覆蓋映射它。

在您的automapping設置中,創建一個override並使用Access屬性明確映射該屬性,以告訴NHibernate如何處理它。

事情是這樣的:

AutoMap.AssemblyOf<YourEntity>() 
    // automapping stuff 
    .Override<ThatClass>(m => 
    { 
    m.Map(x => x.LastActionTimeStamp) 
     .Access.None(); 
    }); 
1

您還可以覆蓋映射,而忽略屬性格式:

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass> 
{ 
    public void Override(AutoMapping<ThatClass> mapping) 
     { 
      mapping.IgnoreProperty(x=> x.PropertyToIgnore); 
     } 
}