Стратегия доступа к свойству NHibernate, Как настроить ее так, чтобы field.camelcase-underscore был предпочтительным, а autoproperty - резервным - PullRequest
2 голосов
/ 03 февраля 2010

Я хочу настроить стратегию доступа таким образом, чтобы при наличии поддержки свойства field.camelcase-underscore использовалось свойство else, использующее автоматическое свойство.

- это поведение по умолчанию (поскольку автопрофилактики возвращаютполя по сути)?или как мне обеспечить это?

1 Ответ

4 голосов
/ 04 февраля 2010

По умолчанию используется установщик свойства, поэтому вам нужно указать доступ в качестве поля подчеркивания верблюда (или любого другого соглашения об именах, которое вы используете), если у вас есть поле поддержки.

Возможно, существует более простой способ добиться этого, но вы можете использовать соглашения Fluent NHibernate, чтобы принудительно применять такое поведение, используя поля поддержки, если они доступны, и установщики в противном случае. Когда применяется соглашение, вы можете поразмышлять над типом сущности, чтобы проверить, есть ли соответствующее поле подчеркивания верблюда или нет. Если найдено вспомогательное поле, вы изменяете отображение, чтобы использовать подчеркивание верблюда в качестве доступа.

Вот пример использования 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...