实体框架核心(EF核心)是一种流行的ORM(对象关系映射)从微软允许您执行CRUD操作(创建、读取、更新和删除),而无需知道数据是保存在底层数据库。
使用orm时,我们经常利用模型映射到数据库表。然而,如果我们有一个模型,不模仿一个数据库表?我们如何映射走眼类型和填充对象的模型在我们的应用程序?我们可以完成这个查询类型。
最初在EF核心2.1中引入的,查询类型非实体类型(类),可以映射到数据库中的表或视图没有身份列指定,意义缺乏一个关键的表和视图。EF核心查询类型使它更简单的查询视图和模型类型不需要标识列。然而,由于查询类型没有定义一个标识列,你不能插入、更新或删除数据。您可以使用它们来检索数据。
查询类型允许您指定一个数据库查询和域之间的映射类。然后,您可以使用相同的查询类型与不同类型的EF核心查询,比如LINQ实体或EF核心迁移。
本文讨论如何使用EF核心查询类型在ASP。网络核心7应用程序。使用本文提供的代码示例,您应该Visual Studio 2022预览安装在您的系统。如果你不已经有一个副本,你可以在这里下载Visual Studio 2022。
创建一个ASP。网络核心7Web API project in Visual Studio 2022
首先,让我们创建一个ASP。网络核心Web API project in Visual Studio 2022. Following these steps will create a new ASP.NET Core Web API project in Visual Studio 2022:
- 启动Visual Studio 2022 IDE。
- 点击“创建新项目。”
- 在“创建新项目”窗口中,选择“ASP。网络核心Web API” from the list of templates displayed.
- 单击Next。
- 在“配置您的新项目”窗口中,指定新项目的名称和位置。
- (可选)检查“解决方案和项目在同一个目录”复选框,根据您的喜好。
- 单击Next。
- 下所示的“其他信息”窗口中,在框架下,选择。net 7.0。
- 离开这个复选框,表示“使用控制器…”检查,因为我们将使用控制器在这个例子。离开“验证类型”设置为“无”(默认)。
- 确保复选框“使码头工人”,“为HTTPS,配置”和“启用开放API支持”是不受我们不会使用这些特性。
- 单击Create。
我们将使用ASP。网络核心7Web API project to work with EF Core query types in the subsequent sections of this article.
处理查询类型在ASP。网络核心7
让我们首先创建一些实体,我们可以查询。我们将使用以下两个类,老师和批处理,在我们的例子中。
公开课的老师{公共int Id{得到;设置;公共字符串FirstName}{得到;设置;公共字符串LastName}{得到;设置;公共ICollection} <批>批次{得到;设置;{}}公开课批{公共int Id获取;设置; } public string Title { get; set; } public int NoOfStudents { get; set; } public int TeacherId { get; set; } }
数据库中创建一个视图
现在创建一个视图命名BatchDetails与下面的代码在您的数据库。我们将使用查询类型映射到这个观点。
创建视图BatchDetails作为选择t。FirstName, t。姓,t。BatchTitle, t。NoOfStudents Total_Students从老师t加入批b b。Id = t.Id
我们还需要一个类,它可以用来存储数据检索从我们刚刚创建的视图。下面的代码片段演示了如何创建一个名为BatchDetails的类来存储数据的查询视图。
公开课BatchDetails{公共字符串FirstName{得到;设置;公共字符串LastName}{得到;设置;公共字符串标题}{得到;设置;公共int NoOfStudents}{得到;设置;}}
在英孚的核心配置查询类型
你有两种方式配置查询类型。如果你想避免弄乱你的DbContext,您可以创建您DbContext类部分类然后DbQuery声明分割成一个单独的文件。
这是DemoDbContext的内容。cs文件:
公共部分类DemoDbContext: DbContext{公共DbSet <老师>老师{得到;设置;公共DbSet} <批>批次{得到;设置;}}
这是DemoDbContextQuery的内容。cs文件:
公共部分类DemoDbContext: DbContext{公共DbQuery < BatchDetails >批次{得到;设置;}}
你应该配置查询输入OnModelCreating方法,如下面代码片段所示。
保护覆盖空白OnModelCreating (ModelBuilder ModelBuilder) {modelBuilder.Query < BatchDetails > () .ToView (“BatchDetails”);}
创建一个存储库在ASP。网络核心
现在我们将创建一个存储库从数据库读取数据。注意,尽管存储库将直接与数据库交互,控制器将使用存储库获取数据。(我们将在下一节实现控制器)。
创建一个名为IBatchRepository的文件。cs与下面的代码。为我们的BatchDetailsRepository IBatchRepository将作为接口。
公共接口IBatchDetailsRepository{公共列表< BatchDetails > GetBatchDetails ();}
创建另一个名为BatchDetailsRepository的文件。cs并输入以下代码来创建存储库类。
公共类BatchDetailsRepository: IBatchDetailsRepository{私人DemoDbContext dbContext;公共BatchDetailsRepository (DemoDbContext DemoDbContext) {dbContext = DemoDbContext;{}< BatchDetails > GetBatchDetails公共列表()返回dbContext.BatchDetails.ToList ();}}
创建一个API控制器在ASP。网络核心
现在,创建一个API控制器命名BatchDetailsController具有相同名称的文件和cs扩展。然后编写以下代码。
(路线(“api /(控制器)”)][ApiController]公开课BatchDetailsController: ControllerBase{私人IBatchDetailsRepository _batchDetailsRepository;公共BatchDetailsController (IBatchDetailsRepository batchDetailsRepository) {_batchDetailsRepository = batchDetailsRepository;}(HttpGet)公共IActionResult Get(){返回Ok (_batchDetailsRepository.GetBatchDetails ());}}
参考前面的代码清单。注意依赖注入已被用于注入类型的一个实例IBatchDetailsRepository BatchDetailsController类的构造函数中。
你可以从原始SQL查询返回查询类型使用在DbQuery FromSql方法类型,他们可以参与的关系。
最后,有两个限制你应该记住的查询类型。正如上面提到的,因为查询类型不能被跟踪的情况下,你只能使用它们进行读取,而不是写道。你不能使用的添加和附加方法DbContext处理查询类型。