我可以让OrmLite为PostgreSQL列名使用小写而不是使用带有下划线命名的小写吗?

时间:2014-04-24 13:21:50

标签: postgresql ormlite-servicestack

我正在调查ServiceStack并且正在使用OrmLite来对抗PostgreSQL数据库。我创建了我的POCO类,如下所示:

public class Company
{
    [AutoIncrement]
    public long Id { get; set; }
    public string CompanyName { get; set; }
    public int NumberOfLicenses { get; set; }
}

我还根据SS站点上的指示在Global.asax文件中设置数据库连接。这是代码:

container.Register<IDbConnectionFactory>(
                c => new OrmLiteConnectionFactory("Server=localhost;Port=5432;SearchPath=company;Database=company;User Id=ABC; Password=XYZ;", PostgreSqlDialect.Provider)
                {
                    ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
                });

正如您所看到的,我有PostgreSQL方言提供程序和迷你分析器。由于我正在测试,我只是在这里添加假数据:

using (IDbConnection db = container.Resolve<IDbConnectionFactory>().Open())
            {
                db.Insert(new Company { CompanyName = "Company A", NumberOfLicenses = 13});
                db.Insert(new Company { CompanyName = "Company B", NumberOfLicenses = 82});
                db.Insert(new Company { CompanyName = "Company C", NumberOfLicenses = 16});
                db.Insert(new Company { CompanyName = "Company D", NumberOfLicenses = 8});
                db.Insert(new Company { CompanyName = "Company E", NumberOfLicenses = 107});
                db.Insert(new Company { CompanyName = "Company F", NumberOfLicenses = 56});
            }

当我运行应用程序时,出现错误:ERROR:42703:关系“company”的列“company_name”不存在

这是有道理的,因为我的数据库在公司表中有一个名为companyname的列,而不是company_name。 PostgreSQL特别关注case,所以我的列名都是小写的。但是,我的POCO属性是驼峰式的。看起来PostgreSQL提供程序代码强制使用每个大写字母之间的_符号命名camelcase属性。在数据库中,我暂时将companyname列重命名为company_name,果然,错误已移至NumberOfLicenses属性,该属性变为number_of_licenses。

我是否可以更改此行为,以便我的POCO属性在没有_符号的情况下映射为小写?

由于

1 个答案:

答案 0 :(得分:0)

您可以使用以下命令指定自己的命名策略:

public class LowercaseNamingStrategy : OrmLiteNamingStrategyBase
{
    public override string GetTableName(string name)
    {
        return name.ToLower();
    }

    public override string GetColumnName(string name)
    {
        return name.ToLower();
    }

}

OrmLiteConfig.DialectProvider.NamingStrategy = new LowercaseNamingStrategy();