如何使用EF核心查询类型在ASP。网络核心7

利用查询类型在EF核心没有钥匙和查询类型映射到表和视图,缺乏一个标识列。

  • 在Facebook上分享
  • 在Twitter上分享
  • 分享在LinkedIn
  • 在Reddit分享
  • 通过电子邮件分享
  • 印刷资源
问号路面
薇罗尼卡Debord-Lazaro(2.0 CC冲锋队)

实体框架核心(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:

  1. 启动Visual Studio 2022 IDE。
  2. 点击“创建新项目。”
  3. 在“创建新项目”窗口中,选择“ASP。网络核心Web API” from the list of templates displayed.
  4. 单击Next。
  5. 在“配置您的新项目”窗口中,指定新项目的名称和位置。
  6. (可选)检查“解决方案和项目在同一个目录”复选框,根据您的喜好。
  7. 单击Next。
  8. 下所示的“其他信息”窗口中,在框架下,选择。net 7.0。
  9. 离开这个复选框,表示“使用控制器…”检查,因为我们将使用控制器在这个例子。离开“验证类型”设置为“无”(默认)。
  10. 确保复选框“使码头工人”,“为HTTPS,配置”和“启用开放API支持”是不受我们不会使用这些特性。
  11. 单击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处理查询类型。

版权©2022 ID金宝搏体育下载G通信公司。

如何选择low-code开发平台