代码之家  ›  专栏  ›  技术社区  ›  Jon Erickson

nhibernate属性访问策略,如何设置它,以便field.camelcase-underline是首选,但autoproperty会后退。

  •  2
  • Jon Erickson  · 技术社区  · 15 年前

    我想设置访问策略,以便如果存在field.camelcase-underline属性支持,则使用该属性,否则使用自动属性。

    这是默认行为吗(因为自动道具基本上有后退字段)?或者我如何执行?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Erik Öjebo    15 年前

    默认情况下使用属性的setter,因此如果有支持字段,则需要将访问指定为camelcase下划线字段(或使用的任何命名约定)。

    可能有一种更简单的方法来实现这一点,但是您可以使用FluentNHibernate的约定来强制执行这种使用支持字段(如果可用)和设置器的行为。当应用约定时,可以在实体类型上进行反射,以检查是否存在对应的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;
        }
    }