2010-02-03 62 views

回答

3

默認情況下使用該屬性的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; 
    } 
}