【Entity Framework】你知道如何处理无键实体吗

news2024/11/25 11:38:36

【Entity Framework】你知道如何处理无键实体吗

文章目录

  • 【Entity Framework】你知道如何处理无键实体吗
    • 一、概述
    • 二、定义无键实体类型
          • 数据注释
    • 三、无键实体类型特征
    • 四、无键实体使用场景
    • 五、无键实体使用场景
    • 六、无键使用示例
      • 6.1 定义一个简单的Blog和Post模型:
      • 6.2 定义一个简单数据库视图
      • 6.3 定义一个类来保存数据库视图的结果
      • 6.4 使用HasNoKey API在OnModelCreating中配置无键实体类型
      • 6.5 配置`DbContext`以包含`DbSet<T>`
      • 6.7 采用标准方式查询数据库视图
    • 七、总结

在这里插入图片描述

一、概述

Entity Framework 除了常规实体类型外,EF Core模型还可以包含无键实体类型,可用于对不包含键值的数据执行数据库查询。

二、定义无键实体类型

可按如下定义无键实体类型:

  • 数据注释
[Keyless]
public class BlogPostsCount
{
    public string BlogName{get;set;}
    public int PostCount{get;set;}
}
  • Fluent API
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BlogPostsCount>()
        .HasNoKey();
}

三、无键实体类型特征

无键实体类型支持与常规实体类型相同的多个映射功能,例如继承映射和导航属性。在关系存储上,它们可以通过Fluent API方法或数据注释来配置目标数据库对象和列。

但是,它们不同于常规实体类型,因为他们:

  • 不能定义键

  • 永远不会对DbContext中的更改进行跟踪,因此不会对数据库进行插入,更新或删除这些操作

  • 绝不会被约定发现

  • 仅支持导航映射功能的子集,具体如下:

    • 它们永远不能充当关系的主体端
    • 它们可能没有指向从属实体的导航
    • 它们只能包含指向常规实体的引用导航属性
    • 实体不能包含无键实体类型的导航属性
  • 需要配置 [Keyless] 数据注释或 .HasNoKey() 方法调用

  • 可以映射到定义查询。 定义查询是在模型中声明的查询,它充当无键实体类型的数据源

  • 可以具有层次结构,但必须映射为 TPH

  • 不能使用表拆分或实体拆分

四、无键实体使用场景

无键实体类型的一些主要使用场景包括:

  • 充当SQL查询的返回类型
  • 映射到不包含主键的数据库视图
  • 映射到未定义主键的表
  • 映射到模型中定义的查询

五、无键实体使用场景

可以使用 ToTableToView Fluent API 将无键实体类型映射到数据库对象。 从 EF Core 的角度来看,此方法中指定的数据库对象是一个视图,这意味着它将被视为只读查询源,并且不能作为更新、插入或删除操作的目标。 但是,这并不意味着数据库对象实际上必须是数据库视图。 它也可以是将被视为只读的数据库表。 相反,对于常规实体类型,EF Core 假设 ToTable 方法中指定的数据库对象可以作为表,这意味着它可用作查询源,但也可作为更新、删除和插入操作的目标。 事实上,可以在 ToTable 中指定数据库视图的名称,只要该视图配置为可在数据库上更新,一切都应能正常运行。

六、无键使用示例

6.1 定义一个简单的Blog和Post模型:

public class Blog
{
    public int BlogId { get; set; }
    public string Name { get; set; }
    public string Url { get; set; }
    public ICollection<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public int BlogId { get; set; }
}

6.2 定义一个简单数据库视图

db.Database.ExecuteSqlRaw(
    @"CREATE VIEW View_BlogPostCounts AS
                SELECT b.Name, Count(p.PostId) as PostCount
                FROM Blogs b
                JOIN Posts p on p.BlogId = b.BlogId
                GROUP BY b.Name");

6.3 定义一个类来保存数据库视图的结果

public class BlogPostsCount
{
    public string BlogName { get; set; }
    public int PostCount { get; set; }
}

6.4 使用HasNoKey API在OnModelCreating中配置无键实体类型

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<BlogPostsCount>(
            eb =>
            {
                eb.HasNoKey();
                eb.ToView("View_BlogPostCounts");
                eb.Property(v => v.BlogName).HasColumnName("Name");
            });
}

6.5 配置DbContext以包含DbSet<T>

public DbSet<BlogPostsCount> BlogPostCounts { get; set; }

6.7 采用标准方式查询数据库视图

var postCounts = db.BlogPostCounts.ToList();
foreach (var postCount in postCounts)
{
    Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts.");
    Console.WriteLine();
}

七、总结

无键主要应用在SQL、视图、存储过程的查询,在制作报表时,应用比较多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】初识 Git

文章目录 1. 提出问题2. 如何解决&#xff1f;版本控制器3. 注意事项 1. 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失、更改失误、失误后能恢复到原来的版本&#xff0c;不得不复制出一个副…

TensorFlow实战 PDF书籍分享

今天又来给大家推荐一本大模型方面的书籍<TensorFlow实战>。《TensorFlow实战》希望用简单易懂的语言带领大家探索TensorFlow&#xff08;基于1.0版本API&#xff09;。 本书讲述了TensorFlow的基础原理&#xff0c;TF和其他框架的异同。并用具体的代码完整地实现了各种…

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例-汇总

github求⭐ 可通过github 地址和npm 地址查看全部内容,范例Ⅰ、Ⅱ、Ⅲ、Ⅳ免VIP查阅 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅰ)配置项文档 vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取…

[Java EE] 多线程(一) :线程的创建与常用方法(上)

1. 认识线程 1.1 概念 1.1.1 什么是线程 ⼀个线程就是⼀个"执⾏流".每个线程之间都可以按照顺序执⾏⾃⼰的代码.多个线程之间"同时"执⾏ 着多份代码. 还是回到我们之前的银⾏的例⼦中。之前我们主要描述的是个⼈业务&#xff0c;即⼀个⼈完全处理⾃⼰的…

十大排序——9.桶排序

这篇文章我们来介绍一下桶排序 目录 1.介绍 2.代码实现 3.总结与思考 1.介绍 桶排序和计数排序一样&#xff0c;都不是基于比较进行排序的。 下面通过一个例子来理解一下桶排序吧。 首先&#xff0c;给你一个无序数组[ 20,18,28,66,25,31,67,30 ]&#xff0c;然后&#…

CANoe中LIN工程主节点的配置(如何切换调度表)

1&#xff1a;前置条件 1&#xff09;工程已经建立&#xff0c;simulation窗口已经配置好&#xff08;包括且不限于通道mappin好&#xff0c;数据库文件已经添加&#xff09; 2&#xff09;我已系统自带sampleCfg工程&#xff0c;作为例子。如下图 2 &#xff1a;主节点的配置…

普发Pfeiffer CCR263 CCR272 CMR261 CMR273 PBR260 IMR265 TPR265 使用说明手侧

普发Pfeiffer CCR263 CCR272 CMR261 CMR273 PBR260 IMR265 TPR265 使用说明手侧

PhpStorm2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 PhpStorm是由JetBrains公司开发的一款商业的PHP集成开发环境&#xff08;IDE&#xff09;&#xff0c;深受全球开发人员的喜爱。它旨在提高开发效率&#xff0c;通过深刻理解用户的编码习惯&#xff0c;提供智能代码补全、快速导…

线程终止操作

关于线程的终止&#xff0c;我们有两种方法来实现 1.使用一个标志位 private static boolean flag true;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {while (flag) {System.out.println("你好");}});//…

【C语言】带你完全理解指针(五)练习

复习一下对数组名的理解 数组名的理解 数组名是数组首元素的地址 但是有2个例外&#xff1a; 1. sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小&#xff0c;单位是字节 2. &数组名&#xff0c;这里的数组名表示整个数组&#xff…

《六》输入组控件InputWidget---Combo Box

一、Qt 输入组控件(Input Widgets&#xff09; Qt Input Widgets是一组用户界面元素&#xff0c;用于输入和显示文字和数字等的数据。这些小部件可以组成各种不同的表单和对话框&#xff0c;用户可以使用这些小部件与程序交互。 以下是Qt Input Widgets的一些常见小部件&…

L2-3 完全二叉树的层序遍历

完全二叉树的层序遍历 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点&#xff0c;这样的树就是完全…

跟着Datawhale重学数据结构与算法

数据结构和算法之前学过&#xff0c;现在跟着Datawhale重学一下&#xff0c;就当是监督自己学习&#xff0c;重新拾起来养成一个好的习惯&#xff0c;以后可以一直坚持下去。 开源链接&#xff1a;【 教程地址 】【电子网站】 首先&#xff1a; #mermaid-svg-Cdr3rn9fGCVAiKS…

STM32-ADC(独立模式、双重模式)

ADC简介 18个通道&#xff1a;外部信号源就是16个GPIO回。在引脚上直接接模拟信号就行了&#xff0c;不需要侄何额外的电路。引脚就直接能测电压。2个内部信号源是内部温度传感器和内部参考电压。 逐次逼近型ADC: 它是一个独立的8位逐次逼近型ADC芯片&#xff0c;这个ADC0809是…

C语言 | 自定义类型:联合和枚举

目录&#xff1a; ----前言 1. 联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联合体对比 1.4 联合体大小的计算 1.5 联合的使用 1.6联合体的练习 2. 枚举 2.1 枚举类型的声明 2.2 枚举类型的优点 2.3 枚举类型的使用 --前言&#xff1a; c语言中内…

String类的几个常用方法

描述 以下程序演示了String类的几个常用方法&#xff0c;包括比较字符串、取得字符串长度、拆分字符串、获取子串、字符串转换成字符数组、获取字符串位置、替换字符串等方法。 案例 public class StringTest {public static void main(String[] args) {//比较字符串String …

阿赵UE学习笔记——28、粒子系统Niagara简介

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次开始学习粒子系统的使用。 一、Cascade系统 在介绍UE5的Niagara系统之前&#xff0c;必须先介绍一下旧版本的粒子系统。   在UE4的时候&#xff0c;虚幻引擎的粒子系统叫做Cascade&#x…

ubuntu 使用conda 创建虚拟环境总是报HTTP错误,转换多个镜像源之后仍报错

最近在使用Ubuntu conda创建虚拟环境时&#xff0c;总是报Http错误&#xff0c;如下图所示&#xff1a; 开始&#xff0c;我以为是conda 镜像源的问题&#xff0c;但是尝试了好几个镜像源都不行&#xff0c;还是报各种各样的HTTP错误。后来查阅很多&#xff0c;总算解决了。解…

数学建模--深入剖析线性规划(模型全方位解读+代码分析)

1.简介 &#xff08;1&#xff09;线性规划三要素 &#xff08;2&#xff09;模型适用赛题 2.典例讲解 &#xff08;1&#xff09;问题分析 目标函数是净收益尽可能大&#xff0c;风险尽可能小&#xff1b; 约束条件是交易费的分段函数&#xff0c;以及每一笔投资都是非负数&am…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…