实体框架数据读取器与带空格的列名不兼容(数据库优先)

时间:2021-07-08 21:22:47

标签: sql-server entity-framework tsql model-view-controller view

我正在尝试将实体框架 (6.4.0) 包装在 SQL 视图 (SQL Server) 周围,其中几列的列名中有空格。例如,SQL 中的一列是“Badge ID”,当我将 EF 环绕此视图时,它会重命名列“Badge_ID”

当我尝试查询时,EF 抛出异常数据读取器不兼容(有道理):

<块引用>

System.Data.Entity.Core.EntityCommandExecutionException:数据 阅读器与指定的“Model.vwEmpOrg”不兼容。成员 类型,“Badge_ID”在 具有相同名称的数据读取器。'

我尝试了一种代码优先方法的解决方案,您可以在类定义中像这样注释列名:

namespace EXAMPLE.Models
{
    using System.ComponentModel.DataAnnotations.Schema;
    

    public partial class vwEmpOrg
    {   
        [Column("Badge ID")] 
        public string Badge_ID { get; set; }

但是同样的异常仍然被抛出。我错过了什么?为什么列名上的注释不起作用?

1 个答案:

答案 0 :(得分:0)

您将需要发布更多特定于您的实体的代码,尤其是自动生成的任何代码以及底层视图,因为 EF6 + SQL Server 使用 DB First 的列名中的空格没有问题。

AFAIK 你不能利用代码优先和 SQL 视图。 Code First 期望创建一个名为 vwEmpOrg 的表。您当然可以使用注释或显式实体配置将 EF 实体映射到现有视图。

例如,我有一个名为 Persons 的表,带有 PersonId 和 Name,我创建了一个名为 vwPersons 的视图:

SELECT PersonId AS [Person ID], Name
FROM dbo.Persons

然后对于实体:

[Table("vwPersons")]
public class ViewPersons
{
    [Key, Column("Person ID")]
    public int PersonId { get; set; }
    public string Name { get; set; }
}

这工作得很好。为了确保 EF 没有对约定进行任何默认设置,我将视图的列别名重命名为“Some ID”,并将实体中的键重命名为指向“Some ID”的“Fudgesicle”,这很好拉那个。 (没有链接回基础表中的“PersonId”)

我会检查您的代码是否实际使用了 vwEmpOrg 的实体定义或映射的 BadgeId,而不是 DbContext 实际使用的是不同命名空间中生成的模型类。 (如果您一直在使用 EDMX 或类似工具)

相关问题