.net core 实践笔记(二)--EF连接Azure Sql
** 温馨提示:如需转载本文,请注明内容出处。**
本文链接:https://www.cnblogs.com/grom/p/9902098.html
笔者使用了常见的三层架构,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");
整个架子基本搞定,下面就可以写业务接口了。
作者:Grom
出处:http://www.cnblogs.com/grom/
Where there is a will there is the way.