如何将包含空格的列名映射到POCO属性?

11

我正在处理一个数据库表,其中一列名称中包含空格,例如“Level Description”。

我无法更改列名。现在我有一个Entity Framework模型类用于这个表,但编译器抱怨该属性,因为属性名不能包含空格!

我该如何在我的类中定义带空格的列?

[Table("StudyLevel")]
public class StudyLevelModel
{
    [Key]
    public byte StudyLevelID { get; set; } 

    // How to map this to the column "Level Description"?
    public string Level Description { get; set; }

    public string SLevelType { get; set; }
    public Nullable<bool> IsActive { get; set; }
    public string ESID { get; set; }
    public string RID { get; set; }
    public byte LevelSearchGroup { get; set; }
}
2个回答

23

您不必将模型属性名称完全匹配表列名;可以应用[Column]属性来将属性映射到列:

[Table("StudyLevel")]
public class StudyLevelModel
{
    [Key]
    public byte StudyLevelID { get; set; } 
    [Column("Level Description")]
    public string LevelDescription { get; set; }
    public string SLevelType { get; set; }
    public Nullable<bool> IsActive { get; set; }
    public string ESID { get; set; }
    public string RID { get; set; }
    public byte LevelSearchGroup { get; set; }
}

1
为了使用Column属性,必须添加using System.ComponentModel.DataAnnotations.Schema; - Oleg Polezky
和 OP 处于同样的境地。存储过程返回了一个 [Fulfillment Name] 字段,这个解决方案对我来说非常完美。 感谢您提供如此清晰的示例。 - csichar
@vapcguy,个人建议尽可能避免使用复合(和自然)键。如果需求发生变化,您不希望处于更改主键的情况下。 - Muflix
@Muflix 如果你使用模型来对 SQL 视图进行操作,那么关于执行复合键,你别无选择。你必须按照我所描述的方式进行。SQL 视图上没有主键 - 主键只存在于表中。 - vapcguy
1
@vapcguy:说得好。如果您无法更改视图并且视图的唯一性由多个列组成,则可能必须使用复合键。 - Muflix
显示剩余2条评论

8

使用ColumnAttribute来设置名称:

 [Column(Name="Level Description")]
 public string LevelDescription { get; set; }

2
它可以在没有名称的情况下工作,例如[Column("Level Description")] public string LevelDescription { get; set; } - K.Z
这是解决方案。很好,你进行了一次编辑。你模型里的属性将会转化为驼峰命名法,并且数据库中的列名也将符合要求。 - Lincoln Pires
小提示 - 如果您需要为复合键(例如反映 SQL 视图的模型)包括 Order,则必须这样做:[Column(name: "Some Name", Order = 0)] (然后是 Order = 1Order = 2 等等...)。但是,对于针对 SQL 表的模型,它将起作用,就像上面所示的那样。不过,您不需要像 @Toxic 所说的那样使用 Name= - vapcguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接