列名称约定

问题描述

| 我想指定一个列名约定,该约定基本上采用pascal大小写的字段并将其转换为带下划线的所有大写字母。因此,属性OrderId变为列\“ ORDER_ID \”。我也希望仅当我尚未在映射中指定一个约定时才应用此约定。到目前为止,我的骨架如下:
public class PascalCaseColumnNameConvention : IPropertyConvention
{
    public bool Accept(IPropertyInstance instance)
    {
        //Not sure what I should have here
    }
    public void Apply(IPropertyInstance instance)
    {
        instance.Column(instance.Property.Name.ChangePascalCasetoUnderscore());
    }
}
除了字符串扩展方法以外,还有没有更好的方法来更改大小写?有没有已经在做这种事情的图书馆?     

解决方法

在这种情况下,使用
Accept
方法时,您应该只选择
return true
。此方法用于确定约定是否应适用于给定的实例,例如,您可能只想更改
int
型字段等的默认名称。如果要定义常规约定,
true
表示\“接受所有实例\”。不过,仍然可以通过在映射中指定列名称来覆盖它。 关于更改大小写-我也不知道这样的库。但是任务很简单,因此您的解决方案在这里看起来很合理。 编辑 好吧,您使用的是哪个FNH版本?我看不到
IPropertyConvention
具有
bool Accept
方法。 您可以在此处实现
IPropertyConvention
(仅使用
void Apply
)和
IPropertyConventionAcceptance
(使用
Accept
方法的工作方式有所不同)。尝试类似的事情(尚未测试):
public class PascalCaseColumnNameConvention : IPropertyConvention,IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => !x.Columns.HasUserDefined());
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.Column(instance.Property.Name.ChangePascalCaseToUnderscore());
    }
}
我还发现一个整洁的类可以进行很多有用的字符串转换-请参见Inflector。但是无论如何,如果您只需要这种特定的转换,我将保留自己的简单解决方案。