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

假设数据库就两个表: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 获取数据库上下文实例的方法和配置连接字符串的更多相关文章

  1. .net Core 基于EF Core 实现数据库上下文

    在做项目时,需要将某一些功能的实体建立在另一个数据库中,连接不同的数据库用以存储记录.通过查找资料,实现EF Core上下文. 下面是实现上下文后的解决方案的目录: 1.UpAndDownDbCont ...

  2. Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)

    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B

  3. EF Core 初始化数据库的两种方法。

    使用DbContextSeed初始化数据库 添加链接字符串 // This method gets called by the runtime. Use this method to add serv ...

  4. ASP.NET Core 6框架揭秘实例演示[25]:配置与承载环境的应用

    与服务注册一样,针对配置的设置同样可以采用三种不同的编程模式.第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象,它可以帮助我们设置面向宿主和应用的 ...

  5. ASP.NET Core 6框架揭秘实例演示[08]:配置的基本编程模式

    .NET的配置支持多样化的数据源,我们可以采用内存的变量.环境变量.命令行参数.以及各种格式的配置文件作为配置的数据来源.在对配置系统进行系统介绍之前,我们通过几个简单的实例演示一下如何将具有不同来源 ...

  6. ASP.NET Core 6框架揭秘实例演示[09]:配置绑定

    我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定.除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置 ...

  7. Asp.Net Core获取当前上下文对象

    HttpContext简介 .Net Core中的HttpContext上下文是个抽象类,命名空间为Microsoft.AspNetCore.Http 所在程序集 \netstandard2.0\Mi ...

  8. Asp.Net Core获取请求上下文HttpContext

    注:特别说明当前版本对应.Net Core2.1意义上框架 一.注入HttpContextAccessor ASP.NET Core中提供了一个IHttpContextAccessor接口,HttpC ...

  9. java中获取各种上下文路径的方法小结

    一.获得都是当前运行文件在服务器上的绝对路径在servlet里用:this.getServletContext().getRealPath(); 在struts用:this.getServlet(). ...

随机推荐

  1. [Luogu3878] [TJOI2010]分金币

    题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 输入输出格式 输入格式: 每个输入文件中包含多 ...

  2. caffe中softmax loss源码阅读

    (1) softmax loss <1> softmax loss的函数形式为:     (1) zi为softmax的输入,f(zi)为softmax的输出. <2> sof ...

  3. Spring Boot 入门(七):集成 swagger2

    本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swa ...

  4. 常用函数-Win-IP

    //************************************************************************* // 函数名: GetAppPath // 返回 ...

  5. React学习系列之(1)简单的demo(React脚手架)

    1.什么是React? React是一个一个声明式,高效且灵活的用于构建用户界面的JavaScript库.React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 ...

  6. QLable 显示图片

    1,各种对就是不显示,因为路径中有其它符号如\n\r什么的 QStringList FileOpeartion::PathCombine (const QString strPath, QString ...

  7. SQL挑战一 : 查找最晚入职员工的所有信息

    以上数据库表: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_nam ...

  8. Jetcache

    转存 Jetcache https://github.com/alibaba/jetcache/wiki/GettingStarted_CN

  9. 使用Wireshark成功解决JavaWeb项目的页面一直加载中的问题

    现象 打开 服务器页面 10.2.155.100,然后发现页面JS显示 加载中..F12浏览器看起来像是发起css等静态资源时卡死.一时定位还以为时 前端的问题. 解决过程 上服务器抓包: tcpdu ...

  10. linux端口查询

    常用端口 下面的表格中列举了包括在红帽企业 Linux 中的服务.守护进程.和程序所使用的最常见的通信端口.该列表还可以在 /etc/services 文件中找到.要查看由互联网号码分派局(IANA) ...