2011-10-20 16 views
4

プロパティがNHibernate 3.2でマッピングされるのを回避する手段はありますか?デフォルトでは、すべてのプロパティがマップされます。コードによるマッピングを使用したプロパティのマッピングを無視する方法 "表記法"

+0

はい。マップしないでください。つまり、ClassMappingコードでProperty(x => x.MyProperty)に移動しないでください。 –

+0

@ThilakNathen私は質問を更新しました。 – Newbie

+0

現在、簡単な方法はありません。 [NH-2816](https://nhibernate.jira.com/browse/NH-2816) –

答えて

2

二つのオプションは、私の知る限りがあります。

1)は、そのことをIsPersistentPropertyを拡張するためにConventionModelMapperとSimpleModelInspectorを拡張あなたの必要性を満たします。

... 
mapper.IsPersistentProperty((memberInfo, declared) => IsPersistentProperty(mapper.ModelInspector, memberInfo, declared, "YourPropertyName")); 
... 


public static bool IsPersistentProperty(IModelInspector modelInspector, MemberInfo member, bool declared, string propertyName) 
{ 
    return (declared ||(member is PropertyInfo) && !IsReadOnlyProperty(member)) && !member.Name.Equals(propertyName); 
} 

private static bool IsReadOnlyProperty(MemberInfo subject) 
{ 
    const BindingFlags defaultBinding = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; 

    var property = subject as PropertyInfo; 
    if (property == null) 
    { 
     return false; 
    } 
    if (CanReadCantWriteInsideType(property) || CanReadCantWriteInBaseType(property)) 
    { 
     return !PropertyToField.DefaultStrategies.Values.Any(s => subject.DeclaringType.GetField(s.GetFieldName(property.Name), defaultBinding) != null) || IsAutoproperty(property); 
    } 
    return false; 
} 

private static bool IsAutoproperty(PropertyInfo property) 
{ 
    return property.ReflectedType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance 
                      | BindingFlags.DeclaredOnly).Any(pi => pi.Name == string.Concat("<", property.Name, ">k__BackingField")); 
} 

private static bool CanReadCantWriteInsideType(PropertyInfo property) 
{ 
    return !property.CanWrite && property.CanRead && property.DeclaringType == property.ReflectedType; 
} 

private static bool CanReadCantWriteInBaseType(PropertyInfo property) 
{ 
    if (property.DeclaringType == property.ReflectedType) 
    { 
     return false; 
    } 
    var rfprop = property.DeclaringType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance 
                      | BindingFlags.DeclaredOnly).SingleOrDefault(pi => pi.Name == property.Name); 
    return rfprop != null && !rfprop.CanWrite && rfprop.CanRead; 
} 
+1

1)動作させることができません:( –

1

重複:Ignore column using mapping by code in HNibernate

次を使用することができます。

mapper.IsPersistentProperty((mi, declared) => 
              { 
               if (mi.DeclaringType == typeof (YourType) && mi.Name == "PropertyNameToIgnore") 
                return false; 
               return true; 
              }); 
+0

いくつかのプロパティが無視される最も単純な例を提供できますか? BeforeMapPropertyハンドラ? – Newbie

+0

回答を修正しました –

+0

これは間違ったコードです。 YourTypeクラスの "PropertyNameToIgnore"を除くすべてのマップされたクラスのすべてのプロパティを永続化します。それらは読み込み専用であり、一度マッピングされたフィールドなどです。 –

2

2)IsPersistentPropertyのデフォルト実装の&ペーストをコピーする別の方法として、それは反射を介して再利用することができる:

var mapper = new ConventionModelMapper(); 
var field = mapper.ModelInspector.GetType() 
    .GetField("isPersistentProperty", BindingFlags.NonPublic | BindingFlags.Instance); 

var ispp = (Func<MemberInfo, bool, bool>)field.GetValue(mapper.ModelInspector); 
mapper.IsPersistentProperty((mi, b) => ispp(mi, b) 
    && (/*any conditions here*/ mi.Name != "SomeFiledName")); 

条件に移動することができ、以下のように

2)使用IsPersistentProperty別の方法またはクラス。式を基にした厳密に型指定されたラッパーをその上に置くことができます。

+0

サンプルをどのように使用することができますか? – Paul

関連する問題