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