zoukankan      html  css  js  c++  java
  • .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
        }
    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");

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

  • 相关阅读:
    IR的评价指标之MRR
    双击启动tomcat中的startup.bat闪退原因及解决方法
    裁判文书网采集说明
    Java 验证码识别之多线程打码兔
    JVM 内存分配机制总结
    Java中多态的一些简单理解
    Java Callable并发编程模板
    JVM
    Command
    解决PHP下载文件时因时文件太大而报404错误
  • 原文地址:https://www.cnblogs.com/grom/p/9902098.html
Copyright © 2011-2022 走看看