我正在尝试将实体框架 (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; }
但是同样的异常仍然被抛出。我错过了什么?为什么列名上的注释不起作用?
答案 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 或类似工具)