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

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

模型类如下

  1. public class User
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public string Number { get; set; }
  6. public string Email { get; set; }
  7. }
  8. public class Blogs
  9. {
  10. public int Id { get; set; }
  11. public string BolgName { get; set; }
  12. public string Url { get; set; }
  13. }

数据库上下文大致这样

  1. public class DataContext : DbContext
  2. {
  3. public DataContext()
  4. {
  5. }
  6. public DataContext(DbContextOptions<DataContext> options) : base(options)
  7. {
  8. }
  9. public DbSet<User> Users { get; set; }
  10. public DbSet<Blog> Blogs { get; set; }
  11. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  12. {
  13. base.OnConfiguring(optionsBuilder);
  14. }
  15. protected override void OnModelCreating(ModelBuilder modelBuilder)
  16. {
  17. base.OnModelCreating(modelBuilder);
  18. }
  19. /*
  20. * 其他实现
  21. */
  22. }

ASP.NET Core 注入

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

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

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

  1. [ApiController]
  2. [Route("[controller]")]
  3. public class WeatherForecastController : ControllerBase
  4. {
  5. private readonly DataContext _context;
  6. public WeatherForecastController(DataContext context)
  7. {
  8. _context = context;
  9. }
  10. }

.NET Core 注入

需要安装一个 Nuget 包

  1. Microsoft.Extensions.DependencyInjection

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

  1. public class ContextService
  2. {
  3. /// <summary>
  4. /// 配置各种服务
  5. /// </summary>
  6. /// <returns></returns>
  7. public static IServiceProvider ServiceProvider()
  8. {
  9. IServiceCollection services = new ServiceCollection();
  10. services.AddDbContext<DataContext>(options => options.UseSqlite("filename=Database.db"));
  11. var serviceProvider = services.BuildServiceProvider();
  12. return serviceProvider;
  13. }
  14. /// <summary>
  15. /// 获取上下文
  16. /// </summary>
  17. /// <param name="services"></param>
  18. /// <returns></returns>
  19. public static DataContext GetContext(IServiceProvider services)
  20. {
  21. var sqliteContext = services.GetService<DataContext>();
  22. return sqliteContext;
  23. }
  24. /// <summary>
  25. /// 获取上下文
  26. /// </summary>
  27. public static DataContext GetContext()
  28. {
  29. var services = ServiceProvider();
  30. var sqliteContext = services.GetService<DataContext>();
  31. return sqliteContext;
  32. }
  33. }

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

  1. var context = ContextService.GetContext();
  2. var list = context.Users.ToList();

无签名上下文 OnConfigure 配置

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

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

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

  1. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  2. {
  3. #if DEBUG
  4. optionsBuilder.UseSqlite("filename=Database.db");
  5. #endif
  6. }

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

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

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

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

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

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

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

构造函数示例:

  1. public DataContext(DbContextOptions<DataContext> options) : base(options)
  2. {
  3. }

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

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

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

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

  1. var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
  2. optionsBuilder.UseSqlite("filename=Database.db");
  3. DataContext context = new DataContext(optionsBuilder.Options);
  4. 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. [Luogu3659][USACO17FEB]Why Did the Cow Cross the Road I G

    题目描述 Why did the cow cross the road? Well, one reason is that Farmer John's farm simply has a lot of ...

  2. [BZOJ1833][ZJOI2010]数字计数

    Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...

  3. Kubernetes的Ingress简单入门

    目录 一.什么是Ingress 二.部署Nginx Ingress Controller 三.部署一个Service将Nginx服务暴露出去 四.部署一个我们自己的服务Cafe 五.部署ingress ...

  4. NDN helper 学习记录

    1.StackHelper 主要用于在请求的节点上安装ndnSIM网络堆栈, 提供一种简单的方法来配置NDN模拟的几个重要参数.(官方解释) 其实就是给结点装上堆栈 方法: 全部结点一次性安装(比较常 ...

  5. 生产环境中利用软链接避免"rm -rf /"的方法

      1.将系统中的rm二进制文件重命名为rm_real:2.编写脚本rm_shell,rm_shell中主要包含以下内容:    2.1)路径转换模块,用于将rm_shell参数中的路径转换为绝对路径 ...

  6. java集合之Stack栈基础

    Stack堆栈: 是后进先出(LIFO)的对象堆栈,继承Vector—AbstractList--AbstractCollection类,底层是通过数组实现, boolean empty() 判断堆栈 ...

  7. 玩转u8g2 OLED库,一篇就够

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  8. Intellij idea 自动生成serialVersionUID

    1 什么是UID 网络间的数据传输最终都是要转化为二进制流的方式进行传输,为了方便转换以及进行验证,我们应该把对角序列化,当实现Seriabizable接口时,UID就是一个必须的属性,可以方便进行版 ...

  9. java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)报错

    今天用spring整合mybatis的时候,报了这个错误.去网上查了一下,网上大多数都是用户权限问题,但是我用SQLyog视图使用root用户crud没有问题,排除了是权限的问题,后面发现是idea提 ...

  10. NetworkManager网络通讯_networkReader/Writer(六)

    unet客户端和服务端进行消息发送时可以采用上一节中方法,也可以直接用networkReader/Writer类进行发送 (一)服务端/客户端注册消息 ; m_Server.RegisterHandl ...