有沒有什麼辦法可以避免使用映射的代碼約定使用NHibernate 3.2映射屬性?默認情況下,所有屬性都被映射。如何忽略映射的代碼使用代碼映射「約定」
回答
有兩個選項,據我所知:
1)擴大ConventionModelMapper和SimpleModelInspector延長IsPersistentProperty使得它滿足您的需求。
2)使用IsPersistentProperty如下:
...
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)不能使它工作:( –
重複:Ignore column using mapping by code in HNibernate
您可以使用以下方法:
mapper.IsPersistentProperty((mi, declared) =>
{
if (mi.DeclaringType == typeof (YourType) && mi.Name == "PropertyNameToIgnore")
return false;
return true;
});
您能提供一個最簡單的例子,它會導致任何數量的屬性被忽略一個BeforeMapProperty處理程序? – Newbie
修改答案 –
這是錯誤的代碼。它使每個映射類的EVERY屬性永久保留,除了YourType類的「PropertyNameToIgnore」。這些是隻讀的,曾經通過字段映射的等等。 –
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"));
條件可以被移動到單獨的方法或類。一個基於表達式的強類型包裝可以在它上面完成。
你可以給一個示例如何使用它? – Paul
- 1. NHibernate通過代碼映射:通過約定映射userTypes
- 2. NHibernate映射代碼映射集合
- 3. 忽略使用HNibernate中代碼映射的列
- 4. 如何使用C#代碼映射映射一對多關係?
- 5. 忽略映射忽略
- 6. NHibernate 3.2映射的代碼忽略我的IUserType
- 7. 不使用映射重寫映射代碼
- 8. 代碼優先映射
- 9. XML映射 - XSLT或代碼?
- 10. 代碼映射很慢
- 11. HTML圖像映射代碼
- 12. ArrayIndexOutOfBoundException在映射代碼
- 13. 級聯映射代碼
- 14. NHibernate 3.2映射IDictionary代碼
- 15. sourceMapRootpath使用LESS的源代碼映射
- 16. 由代碼NHibernate映射:如何映射IDictionary?
- 17. Knockout.js映射忽略
- 18. 我如何定義映射代碼的第一個成員將被wcf忽略
- 19. 實體框架代碼優先忽略表映射
- 20. Nhibernate Loquacious通過代碼映射(未找到=忽略)
- 21. 使用STL映射調試代碼
- 22. 在代碼中映射Enum作爲字符串NHibernate 3.2映射代碼
- 23. 映射多對多關係的問題(通過代碼映射)
- 24. 通過代碼約定到Postgres序列的Nhibernate映射
- 25. 如何從代碼中指定Hibernate映射而不使用JPA
- 26. Nhibernate映射生成器,支持從3.2代碼映射
- 27. 將映射從XML轉換爲確認(代碼映射)
- 28. nhibernate從流暢映射到代碼映射
- 29. NHibernate 3.2根據約定映射(代碼)存儲過程
- 30. 啓用代碼映射功能
是的。不要映射它。即不要在您的ClassMapping代碼中使用Property(x => x.MyProperty)。 –
@ ThilakNathen我已經更新了這個問題。 – Newbie
目前沒有簡單的方法。請投票支持,以實現目標:[NH-2816](https://nhibernate.jira.com/browse/NH-2816) –