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

【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 ASSELECT b.Name, Count(p.PostId) as PostCountFROM Blogs bJOIN Posts p on p.BlogId = b.BlogIdGROUP 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.hqwc.cn/news/624261.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目升级到jdk21后 SpringBoot相关组件的适配

了解到jdk21是一个LTS版本&#xff0c;可以稳定支持协程的功能。经过调研&#xff0c;将目前线上的jdk8升级到21&#xff0c;使用协程提升并发性能。 目前系统使用springBoot 2.0.3.RELEASE&#xff0c;并且引入了mybatis-spring-boot-starter、spring-boot-starter-data-redi…

【简单讲解下npm常用命令】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

瞬态瑞丽波频散曲线提取

频散曲线 function [Y1, f, phase] = das_fft(signal1, signal2, Ts) [y, lag

视频自定义字幕,中英文,彩色的,你也可以,不会不知道吧

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c;有所获&#xff0c;又不为所累。 字幕&#xff0c;大家见过吧&#xff0c;其实你也可以&#xff0c;真的可以&#xff0c;真的真的可以。不难&#xff0c;不难&#xff0c;真的…

`Spring Cloud OpenFeign`底层实现原理

Spring Cloud OpenFeign工作原理 一 、简介 OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解&#xff0c;如RequesMapping等等。 OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口&#xff0c;并通过动态代理的方式产生实现类&#xff…

数据结构OJ:设计循环队列

题目介绍 本题为LeetCode上的经典题目&#xff0c;题目要求我们设计一种循环队列&#xff0c;满足FIFO原则且队尾被连接在队首之后。 思路讲解 题目中介绍循环队列的好处是可以重复利用空间&#xff0c;所以我们很容易想到在初始化时即开辟指定大小的空间&#xff0c;之后便不…

嵌入式4-16

tftpd #include <myhead.h> #define SER_IP "192.168.125.243" //服务器IP地址 #define SER_PORT 69 //服务器端口号 #define CLI_IP "192.168.125.244" //客户端IP地址 #define CLI_PORT 8889 //客户端端…

解决 MSYS2 Qt 6.7 默认 stylesheet 在 windows 11 下的显示故障

项目场景&#xff1a; MSYS2 升级到 Qt6.7.0&#xff0c;发现显示故障&#xff0c;所有Qt6程序以及 QtCreator的SpinBox都显示不全&#xff0c;Combox的底色不对。 问题描述 2024年4月1日&#xff0c;pacman升级MSYS2后&#xff0c;Qt6遇到风格错误。如果使用官方的 Qt onlin…

飞腾UEFI电源控制选择代码解析

飞腾UEFI电源控制选择代码解析 CPLD 处理方式EC 处理方式注:本文以飞腾UEFI edk-code-4.2.0版本进行说明,如果有朋友需要借鉴,请使用该版本代码。 以D2000打工工具为例,下图打包工具中有选择主板电源管理方式,这里可以选择CPLD、EC、和SE,其中SE代表为X100控制上下电时序…

Spring Cloud 集成 Redis 发布订阅

目录 前言步骤引入相关maven依赖添加相关配置 使用方法发布订阅发布一个消息 注意总结 前言 在当今的软件开发领域&#xff0c;分布式系统已经成为一种主流的架构模式&#xff0c;尤其是在处理大规模、高并发、高可用的业务场景时。然而&#xff0c;随着系统复杂性的增加&…

GitHub提交PR

本教程只做开源代码库Github工程提交pr的教程&#xff0c;不做其他的深入的讲解 Github和Gitlab的操作类似&#xff0c;只不过Github叫PR&#xff0c;GitLab叫MR&#xff0c;基本上做法是一致的 以开源项目QuickChat为例 https://github.com/Binx98/QuickChat https://github…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…