0

Fluent NHibernate の自動マッピングの作業モデルを理解するために、ここ数日を費やしてきました。これは非常に素晴らしいことですが、スキーマに欠落している新しい詳細を検出し続けています。クラスに追加のプロパティを追加したいのですが、それらをデータベースにマップしたくありません。典型的なケースは、内部ロジックを持つ追加のプロパティが必要な場合です。
そのため、例を読み、StackOverflow をスキャンしたところ、これは追加する別の規則ではなく、DefaultAutomappingConfiguration を継承して ShouldMap メソッドをオーバーライドするという問題であることがわかりました。
わかりました、問題ありません。1 分後、次のような結果が得られました。

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 プロパティは正常に機能します。ただし、必ず設定されているカスタム属性は検出されません。何故ですか!?
慣習的な方法では、私は同じアプローチを頻繁に使用しており、そこではうまく機能します。規約設定では明らかに検出できるのに、ここでプロパティが定義済みの属性を検出できないのはなぜですか。回避策はありますか?

4

2 に答える 2

2

新しい automapconvention を Automap に追加しましたか?

AutoMap.AssemblyOf<>(new CustomAutomappingConfiguration())

更新:プロパティの代わりに Boolean クラスからスキップ属性を取得しています

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

する必要があります

member.MemberInfo.GetCustomAttributes(typeof(SkipMap), false)
于 2012-04-19T08:03:36.147 に答える
0

カスタム属性がプロパティに適用できることを確認するために、クラスに追加[AttributeUsage(AttributeTargets.Property)]してみてください。SkipMap

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

于 2012-03-29T14:12:50.043 に答える