欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-29 20:32:49
.NET Core 获取数据库上下文实例的方法和配置连接字符串 [TOC] 假设数据库就两个表:User、Blogs, 模型类如下 数据库上下文大致这样 ASP.NET Core 注入 ASP.NET Core 的数据库注入是最为简单方便的了,在 ConfigureServices 配置即可。 然后 ......

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

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