ASP.NET Core 数据库上下文 DBContext
DBContext
Entity Framework 让您使用公共语言运行时(CLR)对象(称为实体)查询、插入、更新和删除数据。Entity Framework 将模型中定义的实体和关系映射到数据库。它还为以下功能:
- 将从数据库返回的数据具体化为实体对象。
- 跟踪对对象所做的更改。
- 处理并发。
- 将对象更改回传数据库。
- 将对象绑定到控件。
负责作为对象与数据交互的主要类是 DbContext。使用上下文的推荐方法是定义从 DbContext 派生的类,并公开表示上下文中指定实体集合的 DbSet
属性。
从逻辑上讲,DBContext 映射到具有 DBContext 可理解的模式的特定数据库。在该 DBContext 类上,可以创建 DbSet<T>
类型的属性。泛型类型参数 T
将是一种实体类型,如 Employee 是 MyFirstCoreWebApp 应用程序中的实体。
配置 DbContext
下面开始配置和初始化数据库上下文类 DbContext。
通过 ASP.NET Core 依赖关系注入
在文件 Startup.cs 的 ConfigureServices
方法中添加以下代码:
services.AddDbContext<MyFirstCoreWebAppDbContext>(options => options.UseSqlServer("Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123456"));
或者通过 appsettings.json 文件配置数据库连接字符串:
"ConnectionStrings": {
"DefaultConnection": "Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123"
}
同时 Startup.cs 的 ConfigureServices
方法中的代码改成如下:
services.AddDbContext<ShoppingCenterContext>(options=>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
然后我们将创建一个 DbContext 类。这里,我们需要在 Models 文件夹中添加一个新类,并将其称为 MyFirstCoreWebAppDbContext。尽管这个类本身不是一个模型,但它确实将我们所有的模型放在一起,以便我们可以在数据库中使用它们。
类 MyFirstCoreWebAppDbContext 必须添加有一个参数 DbContextOptions<MyFirstCoreWebAppDbContext>
的公共构造函数,代码如下:
public class MyFirstCoreWebAppDbContext: DbContext
{
public MyFirstCoreWebAppDbContext(DbContextOptions<MyFirstCoreWebAppDbContext> options) : base(options)
{
}
}
配置完毕后,我们就可以在 ASP.NET Core 控制器或其他服务中通过构造函数注入 MyFirstCoreWebAppDbContext,如:
namespace MyFirstCoreWebApp.Controllers
{
public class HomeController : Controller
{
private readonly MyFirstCoreWebAppDbContext _context;
public HomeController(MyFirstCoreWebAppDbContext context)
{
//通过构造函数注入数据库上下文
_context = context;
}
}
}
使用 new 方法创建
在 MyFirstCoreWebAppDbContext 中重写方法 OnConfiguring
就可以配置数据库连接字符串:
namespace MyFirstCoreWebApp.Models
{
public class MyFirstCoreWebAppDbContext: DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=123456");
}
}
}
或者通过构造函数来传递数据库连接字符串:
namespace MyFirstCoreWebApp.Models
{
public class MyFirstCoreWebAppDbContext : DbContext
{
private readonly string _connectionsString;
public MyFirstCoreWebAppDbContext(string connectionsString)
{
_connectionsString = connectionsString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionsString);
}
}
}
然后代码中就可以这样创建数据库上下文类:
var _context=new MyFirstCoreWebAppDbContext();
或者
var str="Server=.;Database=program;User ID=sa;Password=123456";
var _context=new MyFirstCoreWebAppDbContext(str);
使用 DbContext 工厂
使用工厂方法也是在 Startup.cs 文件的 ConfigureServices 方法中注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContextFactory<MyFirstCoreWebAppDbContext>(options => options.UseSqlServer("Data Source=localhost;Initial Catalog=program;Persist Security Info=True;User ID=sa;Password=xiaozi141"));
}
注意方法改成 AddDbContextFactory。与上面的类一样 MyFirstCoreWebAppDbContext 必须公开具有DbContextOptions<MyFirstCoreWebAppDbContext>
参数的构造函数:
public class MyFirstCoreWebAppDbContext: DbContext
{
public MyFirstCoreWebAppDbContext(DbContextOptions<MyFirstCoreWebAppDbContext> options) : base(options)
{
}
}
然后通过构造函数注入 DbContext 工厂并且通过工厂构造 DbContext 实例:
public class HomeController : Controller
{
private readonly IDbContextFactory<MyFirstCoreWebAppDbContext> _contextFactory;
public HomeController(IDbContextFactory<MyFirstCoreWebAppDbContext> contextFactory)
{
//通过构造函数注入数据库上下文
_contextFactory = contextFactory;
}
public void GetData()
{
using (var context = _contextFactory.CreateDbContext())
{
//...
}
}
}
需要注意的是,以这种方式创建的 DbContext 实例并非由应用程序的服务提供程序进行管理,因此必须由应用程序释放,比如上图所示的使用 using(…)
,用完后立即释放。
配置完毕后,和数据库进行交互的通道就打开了,剩下的工作就是准备并组织好数据,把交由数据库上下文对象处理就可以了。