【Entity Framework】EF中DbSet类详解

news/2024/5/19 22:25:55 标签: .netcore, c#, asp.net, linq, microsoft

【Entity Framework】EF中DbSet类详解

文章目录

  • 【Entity Framework】EF中DbSet类详解
    • 一、概述
    • 二、定义DbSet
      • 2.1 具有DbSet属性的DbContext
      • 2.2 具有 IDbSet 属性的 DbContext
    • 2.3 具有 IDbSet 属性的 DbContext
    • 三、DbSet属性
    • 四、DbSet方法
    • 五、DbContext动态生成DbSet

在这里插入图片描述

一、概述

DbSet可用于查询和保存的TEntity实例。针对的DbSet LINQ查询将转换为针对数据库的查询。

可能不会反映上下文中尚未保存到数据库的更改。如:结果将不包含新添加的实体,并且可能扔包含标记为要删除的实体。

根据所使用的数据库,针对DbSet的LINQ查询的某些部分可能在内存中求值,而不是转换为数据库查询。DbSet对象通常从DbSet派生DbContext的或方法Set()上的属性获取。

Entity Framework Core不支持在同一DbContext实例上运行多个并行操作。这包含异步查询的并行执行以及从多个线程进行的任何显示并发使用。

二、定义DbSet

使用Code First工作流进行开发时,可定义一个派生DbContext,用于表示与数据库的会话,并为模型中的每个类型公开一个DbSet。

2.1 具有DbSet属性的DbContext

Code First 示例中所示的常见情况是拥有一个具有公共自动 DbSet 属性的 DbContext,用于模型的实体类型。 例如:

c#">public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

当在 Code First 模式下使用时,这会将 Blogs 和 Posts 配置为实体类型,并配置可从此访问的其他类型。 此外,DbContext 会自动调用这些属性的资源库来设置相应的 DbSet 的实例。

2.2 具有 IDbSet 属性的 DbContext

在某些情况下,例如创建 mocks 或 fakes 时,使用接口来声明 set 属性会更有用。 在这种情况下,可以使用 IDbSet 接口代替 DbSet。 例如:

c#">public class BloggingContext : DbContext
{
    public IDbSet<Blog> Blogs { get; set; }
    public IDbSet<Post> Posts { get; set; }
}

此上下文的工作方式与使用 DbSet 类作为其 set 属性的上下文完全相同。

2.3 具有 IDbSet 属性的 DbContext

如果你不希望为 DbSet 或 IDbSet 属性公开公共资源库,则可以改为创建只读属性并自行创建 set 实例。 例如:

c#">public class BloggingContext : DbContext
{
    public DbSet<Blog> Blogs
    {
        get { return Set<Blog>(); }
    }

    public DbSet<Post> Posts
    {
        get { return Set<Post>(); }
    }
}

请注意,DbContext 将缓存从 Set 方法返回的 DbSet 的实例,使每个属性在每次调用时都返回相同的实例。Code First 实体类型的发现工作方式与具有公共 Getter 和资源库的属性的工作方式相同。

三、DbSet属性

序号属性名说明
1EntityType与此IEnitityType集关联的元数据
2Local获取一个,LocalView它表示此集中所有“已添加”、“未更改”和“修改”实体的本地视图。

四、DbSet方法

序号方法名说明
1Add将给定实体以“已添加”状态添加到集的基础上下文中,这样一来,当调用 SaveChanges 时,会将该实体插入到数据库中
2AddAsync将给定实体集合添加到基础化集的上下文中(每个实体都置于“已添加”状态),这样当调用 SaveChanges 时,会将它插入到数据库中
3AsNoTracking返回一个新查询,其中返回的实体将不会在 DbContext 中进行缓存. (继承自 DbQuery)
4Attach将给定实体附加到集的基础上下文中. 也就是说,将实体以“未更改”的状态放置到上下文中,就好像从数据库读取了该实体一样
5Create为此集的类型创建新的实体实例. 请注意此实例不会添加或附加到此集. 如果基础上下文配置为创建代理且实体类型满足创建代理的要求,则返回的实例将是一个代理
6Equals确定指定的 DbSet 是否等于当前 DbSet. (重写 DbQuery.Equals(Object).)
7Find查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回.如果未在上下文或存储区中找到实体,则返回 null
8FindAsync异步查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回. 如果未在上下文或存储区中找到实体,则返回 null
9Include指定要包括在查询结果中的相关对象. (继承自 DbQuery)
10Remove将给定实体标记为“已删除”,这样一来,当调用 SaveChanges 时,将从数据库中删除该实体. 请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中
11RemoveRange从基础化集的上下文中删除给定实体集合(每个实体都置于“已删除”状态),这样当调用 SaveChanges 时,会从数据库中删除它
12SqlQuery创建一个原始 SQL 查询,该查询将返回此集中的实体. 默认情况下,上下文会跟踪返回的实体;可通过对返回的 DbSqlQuery

五、DbContext动态生成DbSet

平时我们在使用EF的过程中,都是有DbContext中每一个表加一个DbSet,如果我们一个项目有上千个表,就得加上千个DbSet,是很麻烦的一个工程,现在采用一个简单的方法处理,在DbContext类的OnConfiguring方法中加上如下代码:

c#">protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      var assembly = Assembly.GetExecutingAssembly();
      foreach (Type type in assembly.ExportedTypes)
      {
           if (type.IsClass && type != typeof(EntityBase) && typeof(EntityBase).IsAssignableFrom(type))
           {
                 var method = modelBuilder.GetType().GetMethods().Where(x => x.Name == "Entity").FirstOrDefault();
                 if (method != null)
                 {
                     method = method.MakeGenericMethod(new Type[] { type });
                     method.Invoke(modelBuilder, null);
                 }
            }
        }
        base.OnModelCreating(modelBuilder);
}

http://www.niftyadmin.cn/n/5465968.html

相关文章

前端学习<三>CSS进阶——0102-CSS布局样式

前言 css 进阶的主要内容如下。 1、css 非布局样式 html 元素的分类和特性 css 选择器 css 常见属性&#xff08;非布局样式&#xff09; 2、css 布局相关 css 布局属性和组合解析 常见布局方案 三栏布局案例 3、动画和效果 属于 css 中最出彩的内容。 多背景多投影特…

群晖NAS使用Docker部署大语言模型Llama 2结合内网穿透实现公网访问本地GPT聊天服务

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

晚间兼职攻略:六个副业轻松上手

晚上兼职副业&#xff0c;作为增加额外收入的途径&#xff0c;选择多样且灵活。以下是六个特别适合晚上进行的副业&#xff0c;让你在闲暇时光也能充实自我&#xff0c;获得收益。 1&#xff0c;网络调查与市场研究是一个值得考虑的选项。你可以在晚上抽出空闲时间&#xff0c…

实验四 微信小程序智能手机互联网程序设计(微信程序方向)实验报告

请编写一个用户登录界面&#xff0c;提示输入用户名和密码进行登录&#xff1b; 代码 index.wxml <view class"user"> <form bindreset""> <view>用户名&#xff1a;</view><input type"text"name""/>…

什么是AIGC,AIGC的应用领域有哪些,以及对AIGC的未来展望有什么值得关注的方向

AIGC:人工智能生成内容的深度解析 在数字技术的浪潮中,AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)逐渐崭露头角,成为继专业生产内容(PGC)和用户生产内容(UGC)之后的新型内容创作方式。它不仅改变了内容生产的传统模式,更在多个行业中展现出…

Go语言hash/fnv应用实战:技巧、示例与最佳实践

Go语言hash/fnv应用实战&#xff1a;技巧、示例与最佳实践 引言hash/fnv概览使用hash/fnv的初步步骤导入hash/fnv库创建哈希器实例 hash/fnv在实际开发中的应用生成唯一标识符数据分片与负载均衡快速查找 高级技巧和最佳实践避免哈希碰撞动态调整哈希表大小利用sync.Pool优化哈…

Golang和Java对比

其实我是Javaer转的Golang&#xff0c;我谈谈自己对Java和Golang的体会 我先讲讲我认为Golang的优点 1、Golang是一门新语言&#xff0c;相比于Java&#xff0c;他的生态要小很多&#xff0c;优点很明显&#xff0c;自由度高&#xff0c;学习成本低&#xff0c;能快速拉起一个…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域&#xff0c;图像识别是一个非常重要的任务&#xff0c;其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展&#xff0c;深度卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff…