zoukankan      html  css  js  c++  java
  • .NET Core 获取数据库上下文实例的方法和配置连接字符串

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

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

  • 相关阅读:
    K8s PV and PVC and StorageClass
    WebSphere--WAS概念和原理解析
    K8S配置多集群访问
    ROS2学习日志:CV开发之关联Gazebo/Webots/ROS2
    CV学习日志:Orbslam使用总结
    CV学习日志:Basalt使用总结
    CV学习日志:Kalibr使用总结
    CV学习日志:CamOdoCalib使用总结
    CV学习日志:OpenVINS使用总结
    CV学习日志:搭建U2004开发环境
  • 原文地址:https://www.cnblogs.com/whuanle/p/11908663.html
Copyright © 2011-2022 走看看