2012-02-10 58 views
0

我已經花了幾天時間來了解Fluent NHibernate自動映射工作模型。這是相當不錯的,但我一直在檢測我的模式中缺少的新細節。現在我想爲我的類添加額外的屬性,但沒有將它們映射到數據庫。一個典型的例子是當我需要具有內部邏輯的額外屬性時。
因此,我閱讀了示例並掃描了StackOverflow,發現這不是另一個要添加的約定,而是繼承DefaultAutomappingConfiguration並覆蓋ShouldMap方法的問題。
好,沒問題,一分鐘後,我有這樣的事情:
Fluent NHibernate ShouldMap沒有檢測到我的自定義屬性

public class CustomAutomappingConfiguration : DefaultAutomappingConfiguration 
{ 

    public override bool ShouldMap(Member member) 
    { 
     var explicitSkip = member.PropertyType.GetCustomAttributes(typeof(SkipMap), false).Length > 0; 
     if ((member.IsProperty && !member.CanWrite) || explicitSkip) 
     { 
      return false; 
     } 
     return base.ShouldMap(member); 
    } 
} 


/// <summary> 
/// Don't map this property to database. 
/// </summary> 
public class SkipMap : Attribute 
{ 
} 


public class DemoClass 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual MyBitwiseEnum Status { get; set; } 

    public virtual bool IsValid 
    { 
     get 
     { 
      return (int)Status > 3; 
     } 
    } 

    [SkipMap] 
    public virtual bool IsBad 
    { 
     get 
     { 
      return MyBitwiseEnum.HasFlag(MyBitwiseEnum.Bad); 
     } 
     set 
     { 
      MyEnum = value ? MyBitwiseEnum | MyBitwiseEnum.Bad : MyBitwiseEnum^MyBitwiseEnum.Bad; 
     } 
    } 
} 

我知道我的試聽課是一種愚蠢的,但它說明我的觀點。
這個想法是我想手動決定映射到數據庫的屬性。

readonly屬性工作正常,因爲ShouldMap方法將查找property.CanWrite。但是絕對設置的自定義屬性將不會被檢測到。這是爲什麼!?
在慣例方法中,我經常使用相同的方法,並且在那裏工作正常。爲什麼該屬性無法在此處檢測到已定義的屬性,當它顯然可以在約定中設置時。有沒有解決方法?

回答

2

您是否已將您的新automapconvention添加到Automap?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration()) 

更新:你是從,而不是財產Boolean類獲得跳躍屬性

member.PropertyType.GetCustomAttributes(typeof(SkipMap), false) 

應該

member.MemberInfo.GetCustomAttributes(typeof(SkipMap), false) 
+0

是的! 我假設你的意思是automapCONFIGURATION。我也有幾個約定,但它們都工作正常,不應該影響這個問題。 – 2012-04-20 08:48:53

+0

謝謝!我其實錯過了你的編輯。但是今天我的一位同事發現了同樣的事情,所以我只是爲了通過這個簡單的調整來更新帖子。 MemberInfo而不是PropertyType造就了不同! – 2012-05-03 16:21:34

0

爲了確保自定義屬性適用於屬性,請嘗試將[AttributeUsage(AttributeTargets.Property)]添加到SkipMap類中。

另一種可能性是屬性名稱與另一個適用於不同目標的屬性發生衝突。嘗試將該類重命名爲MyVerySpecialSkipMap之類,然後重新測試以確認您沒有屬性衝突。至少,編寫一些簡單的反射代碼來測試應用程序上下文外的SkipMap屬性,以確保可以找到它。

+0

謝謝您的回答! 我添加了屬性使用聲明,並沒有引起投訴。 – 2012-04-02 13:26:52

+0

我按照建議更改了名稱,但沒有任何區別。具有此屬性的屬性仍然映射到存儲。 它可能是FluentNHibernate中的錯誤嗎?我應該在哪裏舉報? – 2012-04-02 13:32:59

+0

我想通過創建一個簡單的項目來嘗試解決問題,該項目只包含反映代碼以測試查找屬性的SkipMap類。如果它在簡單項目中不起作用,那麼問題可能出現在Fluent NHibernate中。 – 2012-04-02 13:46:50

相關問題