.NETCore 获取数据库上下文[实例的方法和配置连接字符串

简介: .NETCore 获取数据库上下文[实例的方法和配置连接字符串

假设数据库就两个表: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();


工良比较菜。。。上面有很多原理没有弄懂,大神看到指定一下我呗~

相关文章
|
5天前
|
SQL 存储 数据库
提升数据库性能的关键方法总结
提升数据库性能的关键方法总结
|
10天前
|
开发框架 前端开发 .NET
asp.net core 使用 AccessControlHelper 控制访问权限
asp.net core 使用 AccessControlHelper 控制访问权限
|
23天前
|
Cloud Native API C#
C#的现代化:.NET Core引领的技术革命
【6月更文挑战第9天】`.NET Core引领C#现代化,实现跨平台革命,提升性能并支持云原生应用。异步编程模型优化体验,统一API简化开发流程。C#应用场景扩展,开发效率提高,技术创新加速,预示其未来在技术领域将持续发挥关键作用。`
30 10
|
18天前
|
SQL 关系型数据库 MySQL
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
MYSQL————DDL方法使用(包含在数据库,以及具体数据库表格的一些操纵)
|
21天前
|
SQL 数据管理 关系型数据库
数据管理DMS产品使用合集之误删了数据库后,恢复方法有哪些
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
21天前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL数据库的字符串拼接语法使用说明
【6月更文挑战第11天】PostgreSQL数据库的字符串拼接语法使用说明
39 1
|
3天前
|
开发框架 .NET Nacos
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
使用 Nacos 在 C# (.NET Core) 应用程序中实现高效配置管理和服务发现
12 0
|
4天前
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
4天前
|
SQL Java 数据库连接
老程序员分享:JDBC工具类封装、封装DAO方法与数据库表实体类封装的使用案列详情
老程序员分享:JDBC工具类封装、封装DAO方法与数据库表实体类封装的使用案列详情
|
4天前
|
存储 JSON NoSQL
技术心得记录:在.NETCore中使用CSRedis
技术心得记录:在.NETCore中使用CSRedis