EF Core 中无主键实体需显式声明为只读查询类型,通过 HasNoKey() 或 [Keyless] 配置,并必须绑定 ToView() 或 ToTable();不可变更跟踪,不支持 Find/SaveChanges,适用于视图、原生 SQL 等场景。

EF Core 中配置无主键实体,核心就是告诉框架“这个类型没有主键、不参与变更跟踪、只读查询用”。它不是 bug,而是明确设计的查询类型(Query Type),适用于视图、聚合结果、原始 SQL 返回等场景。
EF Core 不会自动识别无主键类,必须手动配置。两种等效方式:
OnModelCreating 中调用 .HasNoKey()
[Keyless] 特性(需引用 Microsoft.EntityFrameworkCore)例如:
modelBuilder.Entity<PlayerClub>()
.HasNoKey()
.ToView("ViewPlayerClub"); // 映射到数据库视图或
[Keyless]
public class PlayerClub
{
public Guid PlayerId { get; set; }
public string PlayerName { get; set; }
public string ClubName { get; set; }
public string ClubCity { get; set; }
}无键实体不能凭空存在,必须绑定到一个数据库对象:
.ToView("ViewName"):明确指向视图(语义更清晰).ToTable("TableName"):也可指向无主键的表(EF Core 仍按只读处理)注意:如果不写 ToView 或 ToTable,迁移命令会尝试为它建表,但因无主键而失败。
无键实体查出来默认是 No-Tracking,这意味着:
Find() —— 编译通过但运行时报错(Find 依赖主键)Add() / Update() / Remove()
public Blog Blog { get; set; }),但反过来不行合法查询示例:
var results = context.PlayerClubs
.Where(x => x.ClubCity.Contains("贵州"))
.ToList();无键实体不是“缺陷补救”,而是为特定需求设计的轻量查询载体:
FromSqlRaw)SELECT COUNT(*) FROM ... GROUP BY)基本上就这些。配置不复杂,但容易忽略 ToView 和禁用 Find 的细节。
以上就是EF Core怎么配置无主键实体 EF Core HasNoKey查询类型教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号