1
我想設置訪問策略,以便如果存在field.camelcase-下劃線屬性後備,則使用否則使用自動屬性。NHibernate屬性訪問策略,如何設置它,以便首選field.camelcase-下劃線,但自動屬性回退
這是默認行爲(因爲汽車道具本質上具有後場)?或者如何執行此操作?
我想設置訪問策略,以便如果存在field.camelcase-下劃線屬性後備,則使用否則使用自動屬性。NHibernate屬性訪問策略,如何設置它,以便首選field.camelcase-下劃線,但自動屬性回退
這是默認行爲(因爲汽車道具本質上具有後場)?或者如何執行此操作?
默認情況下使用該屬性的setter,因此如果您有後臺字段,則需要將訪問指定爲camelcase下劃線字段(或您使用的任何命名約定)。
可能有一個更簡單的方法來實現這一點,但你可以使用流利NHibernate的約定來強制執行這種使用後備字段(如果可用)的行爲,否則就是setter。應用約定時,您可以反映實體類型以檢查是否存在相應的camelcase下劃線字段。如果找到後備字段,則修改映射以使用camelcase下劃線作爲訪問。
這裏是一個使用IPropertyConvention的例子。 (您可能希望在一對多慣例等中進行同樣的檢查):
public class PropertyAccessConvention : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
Type entityType = instance.EntityType;
string camelCaseUnderscoreName =
ConvertToCamelCaseUnderscore(instance.Name);
bool hasBackingField = HasField(entityType, camelCaseUnderscoreName);
// Default is to use property setter, so only modify mapping
// if there is a backing field
if (hasBackingField)
instance.Access.CamelCaseField(CamelCasePrefix.Underscore);
}
private static string ConvertToCamelCaseUnderscore(string propertyName)
{
return "_" +
propertyName[0].ToString().ToLower() +
propertyName.Substring(1);
}
private bool HasField(Type type, string fieldName)
{
FieldInfo backingField = type.GetField(
fieldName,
BindingFlags.NonPublic | BindingFlags.Instance);
return backingField != null;
}
}