EF Core怎么使用视图(View) EF Core映射数据库视图教程

来源:这里教程网 时间:2026-02-21 17:33:35 作者:

EF Core 使用数据库视图,核心就两点:视图要先在数据库里建好,然后在代码里按“无主键实体”映射过去,就能像查表一样查询、过滤、排序。

1. 先在数据库中创建视图

用 SQL Server Management Studio 或其他工具执行类似语句:

CREATE VIEW View_BookDetails AS SELECT b.Id, b.Name, b.Author, c.Name AS CateName FROM Books b JOIN Categories c ON b.CateId = c.Id 视图名建议用英文、不带空格和特殊字符(如 View_BookDetails 加密视图、带参数的视图 EF Core 不支持直接映射,避免使用

2. 定义对应视图的 C# 类

这个类只是数据容器,不需要主键,字段名和类型要跟视图返回列一致:

public class View_BookDetails { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public string CateName { get; set; } } 字段名不区分大小写,但建议跟视图列名保持一致,减少映射歧义 不用加
[Key]
或其他主键特性——视图通常没主键,EF Core 会自动识别为无键实体

3. 在 DbContext 中配置映射

两种主流方式,推荐用 Entity 配置(EF Core 3.0+ 统一推荐):

OnModelCreating
中写:
modelBuilder.Entity().ToView("View_BookDetails");
modelBuilder.Entity().HasNoKey();
如果要用 DbQuery(旧方式,仅限 EF Core 2.x 兼容),也可加:
public DbQuery View_BookDetails { get; set; },再配
modelBuilder.Query<view_bookdetails>().ToView(...)</view_bookdetails>
注意:EF Core 5+ 已废弃
DbQuery
,统一用
Entity.ToView()
+
HasNoKey()

4. 查询视图就像查普通 DbSet

注入 DbContext 后,直接 LINQ 操作即可,完全支持 Where、OrderBy、Take 等:

var books = context.Set().Where(x => x.Author.Contains("张")).OrderBy(x => x.Name).ToList(); 也可以提前声明 DbSet 属性(可选):
public DbSet BookViews { get; set; },然后用
context.BookViews.Where(...)
视图查询走的是 SQL,不是内存计算,性能取决于数据库视图本身的执行效率

基本上就这些。不复杂但容易忽略的是:视图必须存在、类字段要对齐、必须显式调用

HasNoKey()
,否则 EF Core 会报“无法推断主键”的错误。

相关推荐