【问题标题】:Entity Framework data reader incompatible with column names with spaces (database first)实体框架数据读取器与带空格的列名不兼容(数据库优先)
【发布时间】:2021-09-19 08:12:15
【问题描述】:

我正在尝试将实体框架 (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; }

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

【问题讨论】:

  • 请编辑您的问题并逐字添加您收到的确切错误。
  • 另外,您是否尝试过在班级的列名周围添加方括号? [Column("[Badge ID]")]我不确定这是否是有效的语法,但可能值得一试,看看它是否有效
  • 另外,如果您查看由 EF (vwEmpOrg.cs) 自动创建的类,那里的列是如何引用的?
  • @devlincarnate 我尝试在类定义中添加方括号,这是个好主意,但不幸的是它没有用。

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


【解决方案1】:

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

AFAIK 你不能在 SQL 视图中使用 Code-First。 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 或类似产品)

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2012-03-15
    相关资源
    最近更新 更多