专栏公约

时间:2011-04-15 19:21:49

标签: fluent-nhibernate

我想指定一个列名约定,它基本上采用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());
    }
}

除了字符串扩展方法之外,还有更好的方法来处理案例吗?任何已经做过这种事情的图书馆?

1 个答案:

答案 0 :(得分:1)

在这种情况下,Accept方法只需return true。此方法用于确定您的约定是否应该应用于给定实例,例如,您可能只想更改int - 类型字段等的默认名称。如果您要定义一般约定,{{1仅仅意味着“接受所有实例”。 但是,仍然可以通过在映射中指定列名称来覆盖它。

关于更改案例 - 我也不知道这样的库。但是任务很简单,所以你的解决方案似乎非常合理。

修改

嗯,您使用的是什么FNH版本?我看不到trueIPropertyConvention方法。

您可以在此处执行bool Accept(仅限IPropertyConvention)和void ApplyIPropertyConventionAcceptance方法的工作方式略有不同)。尝试类似的东西(尚未测试):

Accept

我还发现了一个整齐的课程,可以进行大量有用的字符串转换 - 请参阅Inflector。但无论如何,如果你只需要这种特殊的转换,我会坚持使用自己的简单解决方案。