默认情况下使用属性的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;
}
}