我正在使用 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>();
该决议最终在有问题的
System.ComponentModel.Annotations
项目中将 WebAPI
从 5.0.0 降级到 4.7.0。所有属性立即被识别。