解决DbContext对象创建问题

解决DbContext对象创建问题

方法一:

使用CallContext

public class BaseController : Controller
    {
        public MyContext db
        {
            get
            {
                var db = CallContext.GetData("DB") as MyContext;
                if (db == null)
                {
                    db = new MyContext();
                    CallContext.SetData("DB", db);
                }
                return db;
            }
        }
    }

 

方法二:

使用线程

 public class BaseController : Controller
    {
        public MyContext db
        {
            get
            {
                MyContext db = null;
                if (HttpContext.Items["DB"] == null)
                {
                    db = new MyContext();
                    HttpContext.Items["DB"] = db;
                }
                else
                {
                    db = HttpContext.Items["DB"] as MyContext;
                }
                return db;
            }
        }
    }

 

转载于:https://www.cnblogs.com/zlp520/p/10579603.html

### 关于 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 = "john@example.com" }); 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 = "newemail@example.com"; await context.SaveChangesAsync(); } // Delete var userToDelete = await context.Users.FindAsync(userId); if(userToDelete != null){ context.Users.Remove(userToDelete); await context.SaveChangesAsync(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值