2011-04-15 128 views
3

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

还有没有更好的方法来调整除了字符串扩展方法的情况?任何已经在做这类事情的图书馆?

回答

1

Accept方法在这种情况下,你应该只return true。这种方法是决定你的约定是否应该申请一个给定的实例,例如你可能只想为你的int-type字段等更改默认名称。如果你定义了一个通用约定,true意味着“接受所有实例”。 尽管如此,仍然可以通过指定映射中的列名来覆盖它。

关于改变案例 - 我也不知道这样的图书馆。但是这个任务很简单,所以你的解决方案在这里看起来非常合理。

编辑

那么,什么FNH版本您使用的?我看不到IPropertyConventionbool 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。但无论如何,如果你只需要这个特定的转换,我会保持自己的简单解决方案。

+0

我运行了一些测试,如果我已经指定了一个列名,它似乎不会“忽略”这个约定。它仍然试图应用该公约。我在我的字符串扩展方法中写了一些额外的处理来检测这个,但只是想我会让你知道。 – 2011-04-15 23:46:32

+0

@Cole W - 你说得对,用户定义的对流比覆盖更重要,对我来说很陌生。无论如何,我尝试了另一种解决方案 - 请参阅编辑。 – NOtherDev 2011-04-16 10:52:54