配置 DbContext¶
配置 DbContextOptions¶
下面的示例将 DbContextOptions 配置为使用 Oscar 提供程序、包含在 connectionString 变量中的连接、提供程序级别的命令超时,以及数据库大小写敏感配置,默认Schema设置:
var connectStrings ="Server=127.0.0.1;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;";
optionsBuilder.UseOscar(connectStrings, optionsAction =>
{
optionsAction.UseDefaultSchema("myschema"); //可选配置 等效OnModelCreating 方法中的modelBuilder.HasDefaultSchema()
optionsAction.UseCaseSensitive(); // 可选参数isCaseSensitive:默认True
//optionsAction.EnableRetryOnFailure(maxRetryCount: 3); // 配置重试策略
});
构造函数参数¶
构造函数可以简单地接受 DbContextOptions,如下所示:
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options) : base(options){}
public DbSet<User> Users { get; set; }
}
[!TIP] 提示DbContext 的基本构造函数还接受 DbContextOptions的非泛型版本,但对于具有多个上下文类型的应用程序,不建议使用非泛型版本.
应用程序现在可以在实例化上下文时传递 DbContextOptions,如下所示:
var connectStrings ="Server=127.0.0.1;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;";
var optionsBuilder = new DbContextOptionsBuilder<UserContext>();
optionsBuilder.UseOscar(connectStrings);
using (var context = new UserContext(optionsBuilder.Options))
{
// to do
}
OnConfiguring¶
您还可以在上下文本身中初始化 DbContextOptions。
虽然你可以将此方法用于基本配置,但你通常仍需要从外部获取某些配置详细信息,例如数据库连接字符串。
可以使用配置 API 或其他任何方法来完成此操作。
若要在上下文中初始化 DbContextOptions,请重写 OnConfiguring
方法,并对提供的 DbContextOptionsBuilder调用方法:
public class UserContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseOscar("Server=127.0.0.1;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;");
}
}
应用程序可以简单地实例化此类上下文,而无需将任何内容传递给构造函数:
using (var context = new UserContext())
{
// to do
}
依赖注入¶
EF Core 支持将 DbContext 与依赖关系注入容器一起使用。 可以通过使用
AddDbContext 方法将 DbContext 类型添加到服务容器中。
AddDbContext 将使你的 DbContext 类型、TContext和对应的
DbContextOptions 可用于从服务容器中注入。
将 DbContext 添加到依赖关系注入:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<UserContext>(options => options.UseOscar("Server=127.0.0.1;Port=2003;User Id=SYSDBA;Password=szoscar55;Database=OSRDB;"));
}
这需要将 构造函数参数 添加到接受 DbContextOptions的 DbContext 类型。
DbContext上下文代码:
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options) : base(options){}
public DbSet<User> Users { get; set; }
}
在 ASP.NET Core 的控制器中应用:
public class MyController : ControllerBase
{
private readonly UserContext _context;
public MyController(UserContext context)
{
_context = context;
}
...
}
在服务中使用上下文注入:
public class MyService
{
private readonly UserContext _context;
public MyService(UserContext context)
{
_context = context;
}
...
}
应用程序代码(直接使用 ServiceProvider):
using (var context = serviceProvider.GetService<UserContext>())
{
// to do
}
// or
var options = serviceProvider.GetService<DbContextOptions<UserContext>>();
using (var context = new UserContext(options))
{
// to do
}
避免 DbContext 线程问题¶
Entity Framework Core 不支持在同一个 DbContext 实例上运行多个并行操作。 这包括异步查询的并行执行以及从多个线程进行的任何显式并发使用。 因此,始终 await 异步调用,或对并行执行的操作使用单独的 DbContext 实例。