NHibernate属性访问策略,如何将其设置为首选field.camelcase-underline,而自动属性是fall back

NHibernate属性访问策略,如何将其设置为首选field.camelcase-underline,而自动属性是fall back,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我想设置访问策略,以便如果存在field.camelcase-下划线属性备份,则使用该属性,否则使用自动属性 这是默认行为吗(因为自动道具基本上有后台字段)?或者如何强制执行此操作?默认情况下使用属性的setter,因此如果有支持字段,则需要将访问权限指定为camelcase下划线字段(或使用的任何命名约定) 可能有一种更简单的方法来实现这一点,但您可以使用Fluent NHibernate的约定来强制执行这种行为,即使用支持字段(如果可用),否则使用setter。应用约定时,可以对实体类型进行

我想设置访问策略,以便如果存在field.camelcase-下划线属性备份,则使用该属性,否则使用自动属性


这是默认行为吗(因为自动道具基本上有后台字段)?或者如何强制执行此操作?

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

可能有一种更简单的方法来实现这一点,但您可以使用Fluent 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;
    }
}