DbContext

下表是DbContext API 的功能概览

DbContext

API 类/功能

相关的EF4

类/功能

目的 DbContext API 优点
DbContext ObjectContext 代表与数据库连接的会话,提供了查询、状态跟踪、保存等功能 简化了大部分ObjectContext功能

DbSet

【内存中】

ObjectSet

对实体类型提供了集合操作,比如Add、Attach、Remove。

继承了DbQuery,所以可以提供查询功能

DbSet 表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合。 可以使用 DbContext.Set 方法从 DbContext 中创建 DbSet 对象。

find现在上下问内存里找,没有再去发送sql

简化了大部分ObjectSet功能
DbQuery ObjectQuery 提供查询功能

DbQuery的查询功能集成在DbSet中,

所以不用直接操作DbQuery

Change

Tracker API

ObjectContext.

ObjectStateManager

获得实体变化跟踪信息以及相关的操作(original values、current values)

受上下文管理

更简单、更直观的API
Validation API N/A 提供自动的数据验证。这个API 利用了.NET 4原生的验证功能 新的
Code First Model Building N/A 基于已有的类以及配置信息来创建数据库及其元数据 新的

如何在自己项目中使用DbContext API

### 关于 C# 中 DbContext 的基本概念 `DbContext` 是 Entity Framework Core (EF Core) 或者 Entity Framework 6 (EF6) 中的核心类之一,它表示实体框架中的上下文对象[^1]。通过 `DbContext` 类可以实现数据库操作,包括查询、保存更改以及管理数据模型。 #### 创建和配置 DbContext 实例 通常情况下,在应用程序中会创建一个继承自 `DbContext` 的子类来定义特定的数据访问逻辑。这个子类可以通过构造函数接收选项参数来进行初始化设置: ```csharp public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<User> Users { get; set; } } ``` 上述代码片段展示了如何基于依赖注入机制传递配置好的选项给 `ApplicationDbContext` 构造器[^2]。 #### 常见问题及其解决方案 ##### 1. 连接字符串错误引发异常 当尝试连接到数据库时如果指定的连接字符串不正确或者丢失,则可能会抛出诸如 “A network-related or instance-specific error occurred while establishing a connection to SQL Server.” 的错误消息。确保项目文件夹下的 appsettings.json 文件中有正确的连接字符串,并且在启动服务之前已加载该配置项[^3]: ```json "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TestDb;Trusted_Connection=True;" } ``` 接着可以在 Startup.cs 配置方法里注册此上下文实例: ```csharp services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); ``` ##### 2. Lazy Loading 性能影响 默认情况下 EF 不支持延迟加载(lazy loading),但如果启用了这一特性而未注意其潜在性能开销的话,可能导致 N+1 查询问题。为了避免这种情况发生,建议显式调用 eager loading 方法 Include() 来预取关联数据集[^4]: ```csharp var userWithPosts = context.Users.Include(u => u.Posts).FirstOrDefault(); ``` ##### 3. 数据库迁移失败 执行 Add-Migration 和 Update-Database 命令过程中遇到各种各样的错误是很常见的现象。其中一种典型情况是因为当前模型状态与现有数据库模式之间存在差异所引起的冲突。此时应该仔细检查 Migration Script 是否准确反映了预期的变化;另外也可以考虑删除旧版 migration 并重新生成新的版本[^5]。 ```powershell Add-Migration InitialCreate Update-Database ``` ### 示例:简单的增删改查操作 下面提供了一个完整的例子演示怎样利用 DbContext 执行 CRUD 操作: ```csharp using var context = new ApplicationDbContext(); // Create context.Users.Add(new User { Name = "John Doe", Email = "[email protected]" }); await context.SaveChangesAsync(); // Read var users = await context.Users.ToListAsync(); // Update var userToUpdate = await context.Users.FirstOrDefaultAsync(x => x.Id == userId); if(userToUpdate != null){ userToUpdate.Email = "[email protected]"; await context.SaveChangesAsync(); } // Delete var userToDelete = await context.Users.FindAsync(userId); if(userToDelete != null){ context.Users.Remove(userToDelete); await context.SaveChangesAsync(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值