2012-02-10 5 views
0

Fluent NHibernateの自動演奏作業モデルを知るために数日を費やしてきました。それは素晴らしいですが、私はスキーマから欠けている新しい情報を検出し続けます。今私は、クラスに追加のプロパティを追加したいが、データベースにマッピングされていない。典型的なケースは、内部ロジックで追加のプロパティが必要な場合です。
例を読んでStackOverflowをスキャンし、これが追加される別の規則ではなく、DefaultAutomappingConfigurationを継承してShouldMapメソッドをオーバーライドすることがわかった。
ファイン、問題はないが、1分後、私はこのようなものだった:
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; 
     } 
    } 
} 

を私は私のデモクラスは一種の愚かであることを知っているが、それは私のポイントを説明します。
考えられるのは、データベースにマップするプロパティを手動で決定したいということです。

ShouldMapメソッドがproperty.CanWriteを検索するため、readonlyプロパティは正常に機能します。しかし、確実に設定されたカスタム属性は検出されません。何故ですか!?
私は同じ手法を頻繁に使いましたが、そこではうまくいきます。慣習的な設定で明白に可能な場合、プロパティが定義済みの属性を検出できないのはなぜですか?回避策はありますか?

答えて

2

Automapに新しいオートマトンを追加しましたか?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration()) 

更新:あなたの代わりにプロパティのブールクラスからスキップ属性を取得している

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

は、あなたの答えのための

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

はい! automapCONFIGURATIONを意味すると思います。私もいくつかの規則を持っていますが、それらはすべて問題なく動作します。 –

+0

ありがとう!私は実際にあなたのこの編集を見逃しました。しかし、今日私の同僚の一人が同じことを発見したので、私はちょうどこの簡単な調整で投稿を更新するためにここに行った。 PropertyTypeの代わりにMemberInfoが違いを作った! –

0

カスタム属性がプロパティに適用されるようにするには、SkipMapクラスに[AttributeUsage(AttributeTargets.Property)]を追加してみてください。

別の可能性は、異なるターゲットに適用される別の属性との属性名の衝突です。クラスの名前をMyVerySpecialSkipMapに変更し、再テストして属性の衝突がないことを確認してください。少なくとも、アプリケーションのコンテキスト外にあるSkipMap属性をテストするための簡単なリフレクションコードを書いて、それが見つかるようにしてください。

+0

感謝する必要があります! 属性使用の宣言を追加しましたが、不満はありませんでした。 –

+0

名前を変更しましたが、違いはありません。この属性を持つプロパティは、引き続きストレージにマップされます。 FluentNHibernateのバグになることはありますか?私はそれをどこかに報告すべきですか? –

+0

私は、反射コードがプロパティの検索をテストするSkipMapクラスのみを含む単純なプロジェクトを作成してトラブルシューティングを試みます。それが単純なプロジェクトでうまくいかない場合、問題はFluent NHibernateにあるかもしれません。 –

関連する問題