.NET Core配置连接字符串和获取数据库上下文实例

Dolly ·
更新时间:2024-11-10
· 587 次阅读

假设数据库就两个表:User、Blogs,

模型类如下

public class User { public int Id { get; set; } public string Name { get; set; } public string Number { get; set; } public string Email { get; set; } } public class Blogs { public int Id { get; set; } public string BolgName { get; set; } public string Url { get; set; } }

数据库上下文大致这样

public class DataContext : DbContext { public DataContext() { } public DataContext(DbContextOptions<DataContext> options) : base(options) { } public DbSet<User> Users { get; set; } public DbSet<Blog> Blogs { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } /* * 其他实现 */ } ASP.NET Core 注入

ASP.NET Core 的数据库注入是最为简单方便的了,在 ConfigureServices 配置即可。

services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));

然后在控制器等地方使用,不需要什么多余代码。

[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private readonly DataContext _context; public WeatherForecastController(DataContext context) { _context = context; } } .NET Core 注入

需要安装一个 Nuget 包

Microsoft.Extensions.DependencyInjection

创建一个类 ContextService,用来配置注入和获取上下文。

public class ContextService { /// <summary> /// 配置各种服务 /// </summary> /// <returns></returns> public static IServiceProvider ServiceProvider() { IServiceCollection services = new ServiceCollection(); services.AddDbContext<DataContext>(options => options.UseSqlite("filename=Database.db")); var serviceProvider = services.BuildServiceProvider(); return serviceProvider; } /// <summary> /// 获取上下文 /// </summary> /// <param name="services"></param> /// <returns></returns> public static DataContext GetContext(IServiceProvider services) { var sqliteContext = services.GetService<DataContext>(); return sqliteContext; } /// <summary> /// 获取上下文 /// </summary> public static DataContext GetContext() { var services = ServiceProvider(); var sqliteContext = services.GetService<DataContext>(); return sqliteContext; } }

需要使用时可以这样获取上下文

var context = ContextService.GetContext(); var list = context.Users.ToList(); 无签名上下文 OnConfigure 配置

上面两个示例中,连接字符串都是使用 Action<DbContextOptionsBuilder> optionsAction 来配置的。

options => options.UseSqlite("filename=Database.db")

我们可以直接在上下文的 OnConfigure 方法里,配置默认使用的连接字符串。

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { #if DEBUG optionsBuilder.UseSqlite("filename=Database.db"); #endif }

但是,极其不建议这样做,一般可能调试环境或为了方便在里面这样做。

这种情况是上下文存在一个无签名构造函数时,外界使用此构造函数直接实例化上下文。

var context = new DataContext(); var list = context.Users.ToList();

这种情况下,是直接实例化上下文,并且使用默认的连接字符串。

OnConfiguring会在无注入、也没有使用有签名构造函数时才会生效,或者描述为多种配置上下文方式中优先级最低。

有签名上下文构造函数和自己new一个上下文

上下文必须具有 DbContextOptions 或 DbContextOptions<T> 的构造函数,建议使用泛型形式。

构造函数示例:

public DataContext(DbContextOptions<DataContext> options) : base(options) { }

具有此构造函数,则可以通过外界注入配置,例如

services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));

如果你不使用注入(Microsoft.Extensions.DependencyInjection)或者第三方 ioc 工具,那么无法使用上面这种形式。

不过可以自己 new,自己传递配置对象,

var optionsBuilder = new DbContextOptionsBuilder<DataContext>(); optionsBuilder.UseSqlite("filename=Database.db"); DataContext context = new DataContext(optionsBuilder.Options); var list = context.Users.ToList();

 到此这篇关于.NET Core配置连接字符串和获取数据库上下文实例的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持软件开发网。



net .NET 连接 数据 字符串 core 上下文 数据库 字符

需要 登录 后方可回复, 如果你还没有账号请 注册新账号