我想指定一个列名约定,它基本上采用pascal cased字段并将其转换为带有下划线的全部大写。因此,属性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());
}
}
除了字符串扩展方法之外,还有更好的方法来处理案例吗?任何已经做过这种事情的图书馆?
答案 0 :(得分:1)
在这种情况下,Accept
方法只需return true
。此方法用于确定您的约定是否应该应用于给定实例,例如,您可能只想更改int
- 类型字段等的默认名称。如果您要定义一般约定,{{1仅仅意味着“接受所有实例”。 但是,仍然可以通过在映射中指定列名称来覆盖它。
关于更改案例 - 我也不知道这样的库。但是任务很简单,所以你的解决方案似乎非常合理。
修改强>
嗯,您使用的是什么FNH版本?我看不到true
有IPropertyConvention
方法。
您可以在此处执行bool Accept
(仅限IPropertyConvention
)和void Apply
(IPropertyConventionAcceptance
方法的工作方式略有不同)。尝试类似的东西(尚未测试):
Accept
我还发现了一个整齐的课程,可以进行大量有用的字符串转换 - 请参阅Inflector。但无论如何,如果你只需要这种特殊的转换,我会坚持使用自己的简单解决方案。