.net core 实践笔记(二)--EF连接Azure Sql
程序员文章站
2022-05-01 14:13:12
** 温馨提示:如需转载本文,请注明内容出处。** 本文链接: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上的语句
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,用于与数据库的交互
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 }
一般数据库连接字符串需要放入配置文件,可以写入自带的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");
整个架子基本搞定,下面就可以写业务接口了。
上一篇: 为什么我国糖尿病患者越来越多?看完这3点,你就明白了!
下一篇: 冬季保健常按七大穴位养阴补肾