2009-06-01 11 views
2

私はIsDirtyというプロパティを含む基本クラスを持っています。これはドメインモデルに使用され、データベーステーブルの列ではありません。FluentNHibernate - ignoreプロパティの自動マッピング

自動マッピングを使用すると、流暢なnhibernateがこの列をテーブルに追加しようとします。これを修正する方法は、.ForTypesThatDeriveFrom<Address>(p => p.IgnoreProperty(x => x.IsDirty))を自動設定に入れることです。

問題は、すべてのエンティティがこれを実行するということです。すべてのエンティティにこの行を追加する必要はなく、これを記述する方法はありますか? .ForTypesThatDeriveFrom<Entity>(p => p.IgnoreProperty(x => x.IsDirty))と入力した場合、EntityをAddressに変換しようとしてエラーが発生します。

また、基本タイプとしてエンティティセットがあります。事前に

おかげで、 JT

+0

類似している間、私は「100%ないメートルので、私は今朝、googleGroupウェブサイトで同様の質問をしました。これはJames Gregoryからの返信です。 WithSetup(c => c.IsBaseClass = type => type == typeof( MyBaseEntity)); x.Dirtyプロパティがその基本クラスに含まれていて、それを除外すると、ボード全体でそれを無視する必要があります。ここ は、リンクで、あなたはStackOverflowの http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6a92d337ea54c30a?hl=en GL上の答えを更新するために戻ってくることができます! – 5x1llz

答えて

1

私はNHibernateのは、不足しているクラスの不満点を除いて、同じ問題を抱えていました。

私はあなたのクラスからプロパティをマップする部分を削除するには、次の規則を使用できると信じて:

public class IgnorePropertiesClassMapConvention : IClassConvention 
{ 
    public bool Accept(IClassMap classMaps) 
    { 
     return true; 
    } 
    public void Apply(IClassMap classMap) 
    { 
     var partsToIgnore = classMap.Parts.OfType<IProperty>() 
      .Where(IgnoreProperty).ToList(); 

     foreach (var part in partsToIgnore) 
      ((IList<IMappingPart>)classMap.Parts).Remove(part); 

    } 

    private bool IgnoreProperty(IProperty property) 
    { 
     // Your logic would be here 
    } 
} 

私は削除するために必要なことだったので、私が使用したコードは、少し異なっていますManyToOneマッピング:

public class IgnorePartsBasedOnReturnTypeClassMapConvention : IClassConvention 
{ 
    public bool Accept(IClassMap classMaps) 
    { 
     return true; 
    } 
    public void Apply(IClassMap classMap) 
    { 
     var partsToIgnore = classMap.Parts.OfType<IManyToOnePart>() 
      .Where(IgnorePart).ToList(); 

     foreach (var part in partsToIgnore) 
      ((IList<IMappingPart>)classMap.Parts).Remove(part); 

    } 
    private bool IgnorePart(IManyToOnePart part) 
    { 
     return IgnoreProperty(part.Property); 
    } 

    private bool IgnoreProperty(PropertyInfo propertyInfo) 
    { 
     var ignoredNamespaces = new []{"namespacesToIgnore"}; 
     return ignoredNamespaces.Any(namespc => propertyInfo.GetGetMethod().ReturnType.Namespace.StartsWith(namespc)); 
    } 
} 

これを行うには、これが最善の方法であるかどうかは分かりません。 私の気持ちは、発見可能性の部分は、不要なプロパティのためにその部分を構築することさえできないという能力でオーバーライドされるべきですが、今のところこれはうまくいくようです。

8

DefaultAutomappingConfigurationから派生したクラスを作成し、ShouldMap(Member member)メソッドを上書きします。

public class AutoMapConfiguration : DefaultAutomappingConfiguration 
{ 
    private static readonly IList<string> IgnoredMembers = new List<string> {"IsNew", "IsDeleted"}; 

    public override bool ShouldMap(Member member) 
    { 
     return base.ShouldMap(member) && !IgnoredMembers.Contains(member.Name); 
    } 
} 

と同様に、あなたの流暢な設定は何かを見ていきます:

ので、同様の答えとは対照的に、私はコメントを残している

Fluently.Configure() 
    // Database settings 
    .Mappings(m => { 
     m.AutoMappings.Add(yourMappingAssembly, new AutoMapConfiguration()) 
    }); 
関連する問題