在一个 ASP.NET 项目中 Entity Framework Core 无法识别数据注释,但在另一个项目中可以正常工作

问题描述 投票:0回答:1

我正在使用 Entity Framework Core 3.1 和“代码优先”方法来处理 .NET 4.8 上的 2 个 ASP.NET 项目。 “代码优先”用引号引起来,因为这实际上是从 EF 6 的迁移,我们删除了

.edmx
文件并修改了
DbContext
。数据库模式已锁定,我们只想获得此功能,而不是让它适应新的数据库更改(并且重新生成
DbContext
/实体不是一个选项,因为它会破坏大量代码)。

无论如何 - 我有一个 Web 项目运行良好(以及几个控制台项目和 Windows 服务),但最后一个 ASP.NET Web API 项目不断抛出错误,首先是在初始化

DbContext
时,然后在运行查询时。

所有异常都是由于实体类数据注释未被识别所致。

这是一个实体示例,其中包含所有正在使用的属性:

namespace Model.EF
{
    using System;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;    
    
    [Table("FaxStatus", Schema = "Global")]
    public partial class FaxStatus
    {
        [Key]
        public int FaxId { get; set; }
        public string XMLStatus { get; set; }
        public string XMLStatusMessage { get; set; }
        public string XMLPath { get; set; }
    }
}

属性定义该实体的表、架构和键。

同样,这在其他六个项目中也运行良好。在问题项目中,在

DbContext
初始化时,我收到一个错误,没有定义密钥,必须添加
OnModelCreating
HasKey
条目以使其满意(当然,这仅适用于不遵循约定的密钥).

然后,当我添加所有这些条目后,进行如下查询:

using (var db = new EFContext())
{
    var statuses = db.FaxStatuses.FirstOrDefault();
}

此代码引发错误:

Microsoft.Data.SqlClient.SqlException(0x80131904):无效的对象名称“FaxStatuses”

我什至检查了 SQL Server Profiler——它试图使用

DbSet<FaxStatus>
属性名称 (
FaxStatuses
) 作为表名称,而不是在属性(甚至是类名称)中指定的名称。

换句话说,SQL 应该是:

SELECT TOP 1 * FROM Global.FaxStatus

但相反,它是:

SELECT TOP 1 * FROM Global.FaxStatuses

我已经验证所有 EF Core 库(基础、SqlServer、关系、代理、抽象)都安装在项目中,且版本与工作项目相同。我查看了所有应用程序启动代码,但找不到任何与 EF Core 配置相关的内容,这些内容可能会造成混乱。

并且

DbContext
和实体类位于所有这些不同项目使用的共享库中。

为什么这个 Web API 项目忽略这些类的属性?

编辑:有几个人问过

FaxStatuses
;它在我的 DBContext 类中声明如下:

public DbSet<FaxStatus> FaxStatuses { get; set; }

我在

OnModelCreating
中也有参考:

modelBuilder.Entity<FaxStatus>();
c# asp.net asp.net-web-api entity-framework-core
1个回答
0
投票

该决议最终在有问题的

System.ComponentModel.Annotations
项目中将
WebAPI
从 5.0.0 降级到 4.7.0。所有属性立即被识别。

© www.soinside.com 2019 - 2024. All rights reserved.