• .net core获取数据库连接 抛出The type initializer to throw an exception


           原文:https://www.cnblogs.com/pudefu/p/7580722.html

      在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别用

    System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配置
    System.Configuration.ConfigurationManager.ConnectionStrings["DBConnectionStr"];//读取connectionStrings配置

    读取配置文件和数据库链接。

      

      现在我们终于迎来.NET Core时代,越来越多的应用被迁移至.NET Core框架下,.NET Core2.0发布以后,.NET Core更加成熟了,原本在.NET Framework框才有的类库.NET Core也基本全部实现,并有增强。因此小菜我也已经准备好加入.NET Core大军中,所以小菜我最近开始修炼.NET Core大法。

      

      欲铸剑,必先打铁,我要一步步来,读取配置文件是一个应用中必不可少的,先弄清怎么读取配置文件,.NET Core配置文件为appsettings.json,为了满足在各个不同类中都能便捷的读取appsettings.json中的配置,所以我需要将读取appsettings.json封装到类库中。在Startup中读取就不说了,在类库中实现读取怎么玩儿?直接上代码,appsettings.json文件内容如下:

    复制代码
    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "ConnectionStrings": {
        "CxyOrder": "Server=LAPTOP-AQUL6MDE\MSSQLSERVERS;Database=CxyOrder;User ID=sa;Password=123456;Trusted_Connection=False;"
      },
      "Appsettings": {
        "SystemName": "PDF .NET CORE",
        "Date": "2017-07-23",
        "Author": "PDF"
      },
      "ServiceUrl": "https://www.baidu.com/getnews"
    }
    复制代码

    建一个项目名称为NetCoreOrder.Common的类库项目,并给该类库项目引入 Microsoft.Extensions.Configuration 和 Microsoft.Extensions.Configuration.Json程序包,类库中加载appsettings.json配置文件代码如下:

    复制代码
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Configuration.Json;
    
    namespace NetCoreOrder.Common
    {
        /// <summary>
        /// 读取配置文件
        /// </summary>
        public class AppConfigurtaionServices
        {
            public static IConfiguration Configuration { get; set; }
            static AppConfigurtaionServices()
            {
                //ReloadOnChange = true 当appsettings.json被修改时重新加载            
                Configuration = new ConfigurationBuilder()
                  .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
                  .Build();            
            }
        }
    }
    复制代码

    读取配置文件的代码完成了,只要引用了NetCoreOrder.Common类库的项目中都能方便读取数据库链接字符串和其他配置,使用方法如下:

    AppConfigurtaionServices.Configuration.GetConnectionString("CxyOrder"); 
    //得到 Server=LAPTOP-AQUL6MDE\MSSQLSERVERS;Database=CxyOrder;User ID=sa;Password=123456;Trusted_Connection=False;

    读取一级配置节点配置

    AppConfigurtaionServices.Configuration["ServiceUrl"];
    //得到 https://www.baidu.com/getnews

    读取二级子节点配置

    AppConfigurtaionServices.Configuration["Appsettings:SystemName"];
    //得到 PDF .NET CORE
    AppConfigurtaionServices.Configuration["Appsettings:Author"];
    //得到 PDF

      注意,如果AppConfigurtaionServices类中抛出FileNotFoundException异常,说明目录下未找到appsettings.json文件,这时请在项目appsettings.json文件上右键——属性——将“复制到输出目录”项的值改为“始终复制”即可

    红色标注这个需要格外注意,我在获取完团队项目后,程序运行登录异常,

     connectionString 获取失败,这是个封装的方法,我们追踪进去

    转到PubConstant.ConnectionString的静态方法中去

    加上try catch 捕获异常,发现在获取配置文件的时候出现错误。

     这样就说明Appsettings.json文件没有找到,但是项目中我们是可以看到的确是存在的

    而程序在运行的时候没有找到,说明程序在编译后运行时的bin目录文件夹下没有该文件,说明程序编译的时候没有生成该文件,导致找不到引发异常。

    所以需要修改该文件的属性。

    如果选择始终复制:则每次编译都会复制会在该程序集的bin目录下生成该文件

    或选择较新则复制:则每次编译都会对比两个文件,不同才会复制到该目录文件,即即使你手动修改了bin目录的这个文件,但是程序编译的时候,它还是会因为文件存在差异,而复制把bin文件下的给覆盖掉,尽管bin目录下的是新版本。

    不过一般我们都是选择始终复制,毕竟我们都是修改项目文件,然后让编译器去编译生成发布文件。

  • 相关阅读:
    Spring Boot的每个模块包详解
    spring框架所有包说明
    TCP三次握手和四次挥手
    线程池实现原理
    AVL树与红黑树
    去哪儿网面经
    什么是缓存一致性问题?如何解决?
    Redis的应用场景和优缺点
    线程池
    手写快排
  • 原文地址:https://www.cnblogs.com/likui-bookHouse/p/11281074.html
Copyright © 2020-2023  润新知