DBSet

Entity Framework的DbContext详解

DbContext
DbContext是EntityFramewoke的一个重要组成部分。 他是一个域或实体类和数据库之间的桥梁。主要负责与数据交互,派生的类DbContext称为实体框架的上下文类

EntitySet: DbContext包含所有的实体映射到数据库表的实体集(DbSet)

  1. 查询: DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库
  2. 更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化
  3. 持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中
  4. 缓存: DbContext默认第一级缓存
  5. 对象实例化: DbContext将原始表数据转换成实体对象
  6. 上下文类覆盖OnModelCreating方法。 可以用来在Code-first开始模式中配置实体

DBSet
DbSet 表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合.代表一个实体集,用于创建、读取、更新和删除操作,可以使用 DbContext.Set 方法从 DbContext 中创建 DbSet对象,常见的DbSet类的方法如下:

名称说明
centered 文本居中right-aligned 文本居右
Add将给定实体以“已添加”状态添加到集的基础上下文中,这样一来,当调用 SaveChanges 时,会将该实体插入到数据库中
AddRange将给定实体集合添加到基础化集的上下文中(每个实体都置于“已添加”状态),这样当调用 SaveChanges 时,会将它插入到数据库中
AsNoTracking返回一个新查询,其中返回的实体将不会在 DbContext 中进行缓存. (继承自 DbQuery)
AsStreaming已过时. 返回将流式处理结果而非缓存它的新查询. (继承自 DbQuery)
Attach将给定实体附加到集的基础上下文中. 也就是说,将实体以“未更改”的状态放置到上下文中,就好像从数据库读取了该实体一样
Create为此集的类型创建新的实体实例. 请注意此实例不会添加或附加到此集. 如果基础上下文配置为创建代理且实体类型满足创建代理的要求,则返回的实例将是一个代理
Create()为此集的类型或派生自此集类型的类型创建新的实体实例. 请注意此实例不会添加或附加到此集. 如果基础上下文配置为创建代理且实体类型满足创建代理的要求,则返回的实例将是一个代理
Equals确定指定的 DbSet 是否等于当前 DbSet. (重写 DbQuery.Equals(Object))
Equals确定指定的 DbSet 是否等于当前 DbSet. (重写 DbQuery.Equals(Object).)
Finalize(继承自 Object.)
Find查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回.如果未在上下文或存储区中找到实体,则返回 null
FindAsync异步查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回. 如果未在上下文或存储区中找到实体,则返回 null
GetHashCode异步查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回. 如果未在上下文或存储区中找到实体,则返回 null
GetType返回当前 DbSet 的类型
Include指定要包括在查询结果中的相关对象. (继承自 DbQuery)
MemberwiseClone(继承自 Object)
Remove将给定实体标记为“已删除”,这样一来,当调用 SaveChanges 时,将从数据库中删除该实体. 请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中
RemoveRange从基础化集的上下文中删除给定实体集合(每个实体都置于“已删除”状态),这样当调用 SaveChanges 时,会从数据库中删除它
SqlQuery创建一个原始 SQL 查询,该查询将返回此集中的实体. 默认情况下,上下文会跟踪返回的实体;可通过对返回的 DbSqlQuery
ToString返回基础查询的 String 表示形式. (继承自 DbQuery)
### C#DBSet 的用法及示例 在 Entity Framework 中,`DbSet<TEntity>` 是一个泛型类,用于表示数据库中的表或视图。它提供了对实体的增删改查操作的支持,并且可以与 LINQ 查询结合使用以实现复杂的查询逻辑[^1]。 #### 创建和配置 `DbContext` 在使用 `DbSet<TEntity>` 之前,需要定义一个继承自 `DbContext` 的类,并在其中声明 `DbSet<TEntity>` 属性。以下是一个简单的示例: ```csharp using System.Data.Entity; public class MyDbContext : DbContext { public DbSet<Employee> Employees { get; set; } // 表示 Employees 表 public DbSet<Department> Departments { get; set; } // 表示 Departments 表 } ``` #### 基本操作 ##### 查询数据 通过 `DbSet<TEntity>` 可以使用 LINQ 查询数据库中的数据。以下是一个查询所有员工的示例: ```csharp using (var context = new MyDbContext()) { var employees = context.Employees.ToList(); // 查询所有员工 } ``` 如果需要根据条件筛选数据,可以结合 LINQ 表达式: ```csharp using (var context = new MyDbContext()) { var highSalaryEmployees = context.Employees .Where(e => e.Salary > 5000) .ToList(); // 查询工资大于 5000 的员工 } ``` ##### 插入数据 通过 `Add` 方法可以向数据库中插入新记录: ```csharp using (var context = new MyDbContext()) { var newEmployee = new Employee { Name = "John Doe", Salary = 6000 }; context.Employees.Add(newEmployee); // 添加新员工 context.SaveChanges(); // 提交更改到数据库 } ``` ##### 更新数据 更新现有记录时,需要先从数据库中获取该记录,然后修改其属性值,并调用 `SaveChanges` 方法保存更改: ```csharp using (var context = new MyDbContext()) { var employee = context.Employees.Find(1); // 根据主键查找员工 if (employee != null) { employee.Salary = 7000; // 修改工资 context.SaveChanges(); // 提交更改 } } ``` ##### 删除数据 通过 `Remove` 方法可以从数据库中删除记录: ```csharp using (var context = new MyDbContext()) { var employee = context.Employees.Find(1); // 查找员工 if (employee != null) { context.Employees.Remove(employee); // 删除员工 context.SaveChanges(); // 提交更改 } } ``` #### 高级功能 ##### Eager Loading 可以通过 `Include` 方法实现关联实体的预先加载,从而减少多次查询数据库的开销: ```csharp using (var context = new MyDbContext()) { var employeesWithDepartments = context.Employees .Include(e => e.Department) // 预先加载 Department .ToList(); } ``` ##### Lazy Loading 默认情况下,Entity Framework 启用了懒加载(Lazy Loading)。这意味着在访问导航属性时,框架会自动从数据库中加载相关数据。如果需要禁用懒加载,可以在上下文中进行配置: ```csharp public class MyDbContext : DbContext { public MyDbContext() { this.Configuration.LazyLoadingEnabled = false; // 禁用懒加载 } public DbSet<Employee> Employees { get; set; } public DbSet<Department> Departments { get; set; } } ``` ##### Explicit Loading 显式加载允许手动控制何时加载关联实体: ```csharp using (var context = new MyDbContext()) { var employee = context.Employees.Find(1); if (employee != null) { context.Entry(employee).Collection(e => e.Departments).Load(); // 手动加载 Departments } } ``` ### 注意事项 - 在使用 `DbSet<TEntity>` 时,确保 `DbContext` 的生命周期得到正确管理,通常使用 `using` 语句来保证资源的释放。 - 如果遇到性能问题,可以考虑优化查询逻辑,例如通过 Eager Loading 减少多次查询数据库的开销[^2]。 ```csharp using (var context = new MyDbContext()) { var employees = context.Employees .Include(e => e.Department) // 预先加载 Department .Where(e => e.Salary > 5000) // 筛选工资大于 5000 的员工 .ToList(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值