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

.net core 实践笔记(二)--EF连接Azure Sql

程序员文章站 2022-08-24 10:31:10
** 温馨提示:如需转载本文,请注明内容出处。** 本文链接:https://www.cnblogs.com/grom/p/9902098.html 笔者使用了常见的三层架构,Api展示层注入了Swagger,作为开发测试使用的文档界面,具体搭建教程网上资料很全,不在赘述。 数据库目前使用了SqlS ......

** 温馨提示:如需转载本文,请注明内容出处。**

本文链接:

 

  笔者使用了常见的三层架构,api展示层注入了swagger,作为开发测试使用的文档界面,具体搭建教程网上资料很全,不在赘述。

  数据库目前使用了sqlserver,建了几张表和测试数据后放到了azure云服务器上,值得一提的是,不同于其他云服务器,azure对于数据库进行了优化和精简(毕竟自己微软自己家的东西,权利就是大),优缺点清参照官网文档。

  笔者体验下来的感觉就是使用门槛要比其他的家的云服务器大的多,用户的账号和token等信息需要在azure上配置,数据库上的权限比精简前可以说是小的多,但也安全。

  orm使用的是entity framework和dapper,执行命令都是使用dapper,毕竟比ef轻的多,ef是用来映射数据库实体类的,在.net core下,少了t4模板,我们就需要使用命令手动映射了。

 

安装ef的包

install-package microsoft.entityframeworkcore.sqlserver
install-package microsoft.entityframeworkcore.tools
install-package microsoft.visualstudio.web.codegeneration.design
install-package microsoft.entityframeworkcore

 

映射模型

scaffold-dbcontext -force “data source=(local); initial catalog=nagrand; pooling=true; uid=sa;pwd=123;connect timeout=10” microsoft.entityframeworkcore.sqlserver -outputdir models

据说能去的空格都要去掉,不然可能会拉取失败。

 

改装成拉azure上的语句

.net core 实践笔记(二)--EF连接Azure Sql

 

scaffold-dbcontext -force “data source=tcp:test-server.database.windows.net,1433; initial catalog=dbname; pooling=true;persist security info=false; uid=sa;pwd=123;trustservercertificate=false;connect timeout=30” microsoft.entityframeworkcore.sqlserver -outputdir models

 

填坑:

  • 如出现错误,请检查拉去的项目(类库)里是否都前面提到的几个包。
  • 注意符号,楼主把这个命令放到了onenote里了,结果第二天就不能用了,试了好多遍发现引号莫名其妙变成中文的了,并且没有语法的错误提示!!
  • 用到的账号和密码一定拿到ssms里登录一下试试
  • 博主使用命令安装包的时候发现项目下有分析器是异常状态,查看是引用了c盘的文件,这个要注意,迁移的时候如果没有这些文件可能会出异常,可以从nugit包里找到这些包一个个手动安装,就不会有异常了。

 dapper

附上一个dapperhelper,用于与数据库的交互

.net core 实践笔记(二)--EF连接Azure Sql
public static class dapperhelper
    {
        #region 连接字符串
        public static string conn_string = "";
        #endregion

        #region select
        /// <summary>
        /// 获取数据集合
        /// </summary>
        /// <typeparam name="t"></typeparam>
        /// <param name="sqlstring"></param>
        /// <param name="param"></param>
        /// <param name="commandtype"></param>
        /// <param name="commandtimeout"></param>
        /// <returns></returns>
        public static list<t> getlist<t>(this string sqlstring, object param = null, commandtype? commandtype = commandtype.text, int? commandtimeout = 180)
        {
            var list = new list<t>();

            using (var db = new sqlconnection(conn_string))
            {
                ienumerable<t> ts = null;
                if (null == param)
                {
                    ts = db.query<t>(sqlstring, null, null, true, commandtimeout, commandtype);
                }
                else
                {
                    ts = db.query<t>(sqlstring, param, null, true, commandtimeout, commandtype);
                }
                if (null != ts)
                {
                    list = ts.aslist();
                }
            }

            return list;
        }

        public static list<t> getlist<t>(this string sqlstring)
        {
            return getlist<t>(sqlstring, null, commandtype.text);
        }

        public static list<t> getlist<t>(this string sqlstring, object param)
        {
            if (null == param)
            {
                return getlist<t>(sqlstring);
            }

            return getlist<t>(sqlstring, param);
        }
        #endregion

        #region insert
        /// <summary>
        /// 单条数据写入 动态模板模式/t
        /// </summary>
        /// <param name="sqlstring"></param>
        /// <param name="param"></param>
        /// <param name="commandtype"></param>
        /// <param name="commandtimeout"></param>
        /// <returns></returns>
        public static bool insert(this string sqlstring, object param = null, commandtype commandtype = commandtype.text, int? commandtimeout = 5)
        {
            return executenonquery(sqlstring, param, commandtype, commandtimeout);
        }

        /// <summary>
        /// 批量写入
        /// </summary>
        /// <typeparam name="t"></typeparam>
        /// <param name="sqlstring"></param>
        /// <param name="list"></param>
        /// <param name="commandtype"></param>
        /// <param name="commandtimeout"></param>
        /// <returns></returns>
        public static bool insert<t>(this string sqlstring, list<t> list, commandtype commandtype = commandtype.text, int? commandtimeout = 5)
        {
            var intresult = 0;

            if (null != list && 0 < list.count)
            {
                using (var db = new sqlconnection(conn_string))
                {
                    intresult = db.execute(sqlstring, list, null, commandtimeout, commandtype);
                }
            }

            return intresult > 0;
        }
        #endregion

        #region update
        public static bool update(this string sqlstring, object param, commandtype commandtype = commandtype.text, int? commandtimeout = 5)
        {
            return executenonquery(sqlstring, param, commandtype, commandtimeout);
        }
        #endregion

        #region delete
        public static bool delete(this string sqlstring, object param, commandtype commandtype = commandtype.text, int? commandtimeout = 5)
        {
            return executenonquery(sqlstring, param, commandtype, commandtimeout);
        }
        #endregion

        #region private methods
        private static bool executenonquery(this string sqlstring, object param, commandtype commandtype = commandtype.text, int? commandtimeout = 5)
        {
            var intresult = 0;
            using (var db = new sqlconnection(conn_string))
            {
                if (null == param)
                {
                    intresult = db.execute(sqlstring, null, null, commandtimeout, commandtype);

                }
                else
                {
                    intresult = db.execute(sqlstring, param, null, commandtimeout, commandtype);
                }
            }

            return intresult > 0;
        }
        #endregion
    }
view code

一般数据库连接字符串需要放入配置文件,可以写入自带的appsetting.xml里或者新建其他的。

{
  "connectionstrings": {
    "dbconnection": "data source={address};initial catalog={dbname};pooling=true;persist security info=false;uid={account};pwd={password};trustservercertificate=false;connect timeout=10"
  },
  "logging": {
    "loglevel": {
      "default": "warning"
    }
  },
  "allowedhosts": "*"
}

 

然后在setup中获取节点并复制到连接字符串

dapperhelper.conn_string = configuration.getconnectionstring("dbconnection");

 

整个架子基本搞定,下面就可以写业务接口了。