如何使用PetaPoco和PostgreSQL对表/列名称进行大小写无关紧要?

时间:2012-07-04 20:59:55

标签: c# postgresql petapoco

我的模特看起来像这样......

[PrimaryKey("TaskId")]
public class Task
{
    public int TaskId { get; set; }

    [StringLength(1000)]
    [DisplayName("What do you want to do?")]
    public string Description { get; set; }

    [DisplayName("When do you want it done?")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = false)]
    [DataType(DataType.Date)]
    public DateTime CompleteByDate { get; set; }

    public bool IsCompleted { get; set; }

    public DateTime InsertDate { get; set; }
    public DateTime UpdateDate { get; set; }
}

如果我尝试从Task表中获取数据,我将看到的第一个错误之一是......

ERROR: 42P01: relation "Task" does not exist

据我所知,问题是PetaPoco会生成像这样的SQL ......

SELECT "Task"."TaskId", "Task"."Description", "Task"."CompleteByDate", "Task"."IsCompleted", "Task"."InsertDate", "Task"."UpdateDate" FROM "Task"

因此,使用引号,大写很重要,而在DB中,如果将列名放在引号中,则列名仅在所有小写中被识别。我想知道是否有办法改变这种状况。我目前看到的唯一解决方法是让我的模型看起来像这样(注意大小写更改)......

[PrimaryKey("taskid")]
[TableName("task")]
public class Task
{
    [Column("taskid")]
    public int taskid { get; set; }

    [StringLength(1000)]
    [DisplayName("What do you want to do?")]
    public string description { get; set; }

    [DisplayName("When do you want it done?")]
    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = false)]
    [DataType(DataType.Date)]
    public DateTime completebydate { get; set; }
    public bool iscompleted { get; set; }
    public DateTime insertdate { get; set; }
    public DateTime updatedate { get; set; }
}

我不希望我的属性都是小写的。为什么我必须这样做,这是唯一的解决办法吗?

2 个答案:

答案 0 :(得分:4)

Petapoco需要与列匹配的确切(区分大小写)名称,但如果您指定Column属性,则可以按照您希望的方式释放该属性的名称(包括更改名称)

[Column("taskid")]
public int TaskID { get; set; }

答案 1 :(得分:0)

如果PetaPoco(无论是什么)生成引用的标识符,那么你就可以了。如果它永远不会生成带引号的标识符,那么您就可以了。如果它有时而不是其他人,那么您需要提交错误报告。

当您等待修复错误时,快速编辑宏/ Perl应该可以帮助您重命名列名等。看起来选择确实使用带引号的标识符,所以只需重命名表定义就可以了对你而言。

哦,当您需要进行任何手动SQL或与其他系统互操作时,您会发现CamelCased标识符非常痛苦。