.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();


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

相关文章
|
12月前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
1689 1
|
9月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
428 13
|
9月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
1783 11
|
10月前
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
946 10
|
11月前
|
SQL Oracle 关系型数据库
比较MySQL和Oracle数据库系统,特别是在进行分页查询的方法上的不同
两者的性能差异将取决于数据量大小、索引优化、查询设计以及具体版本的数据库服务器。考虑硬件资源、数据库设计和具体需求对于实现优化的分页查询至关重要。开发者和数据库管理员需要根据自身使用的具体数据库系统版本和环境,选择最合适的分页机制,并进行必要的性能调优来满足应用需求。
518 11
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
646 26
|
存储 算法 Java
实现不同数据库的表间的 JOIN 运算的极简方法
跨库计算是数据分析中的常见难题,尤其涉及多数据库系统时,表间 JOIN 操作复杂度显著提升。esProc 提供了一种高效解决方案,能够简化跨库 JOIN 的实现。例如,在车辆管理、交管和公民信息系统中,通过 esProc 可轻松完成如下任务:按城市统计有车公民事件数量、找出近一年获表彰的车主信息,以及按年份和品牌统计车辆违章次数。esProc 支持不同关联场景(如维表关联与主子表关联)的优化算法,如内存索引、游标处理和有序归并,从而大幅提升编码和运算效率。无论是同构还是异构数据源,esProc 均能灵活应对,为复杂数据分析提供强大支持。
|
Oracle 安全 关系型数据库
【Oracle】使用Navicat Premium连接Oracle数据库两种方法
以上就是两种使用Navicat Premium连接Oracle数据库的方法介绍,希望对你有所帮助!
2602 28