【问题标题】:Net Core Connection String Dapper visual studio 2017网络核心连接字符串 Dapper Visual Studio 2017
【发布时间】:2018-02-21 13:46:10
【问题描述】:

我正在尝试在我的 .Net Core 应用程序中设置连接字符串,但我不断收到错误消息:

System.NullReferenceException: '对象引用未设置为对象的实例。'

我已尝试将以下内容添加到 appsettings.json

"ConnectionStrings": {

"Analysis": "Server=DESKTOP-MYSERVER;Database=MYDATABASE;User Id=sa; Password=Password123;Provider=System.Data.SqlClient;Trusted_Connection=True;MultipleActiveResultSets=true;Pooling=false;"
}

我也尝试过使用 web.config,就像在 .Net Core 之前使用的那样:

<connectionStrings>
<add name="Analysis" providerName="System.Data.SqlClient" 
     connectionString="Server=DESKTOP-MYSERVER;Database=MYDATABASE;User Id=sm;Password=Password123;"/>

然后在 c# 中我有:

public List<DapperTest> ReadAll()
    {
        var data = new List<DapperTest>();
        using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["Analysis"].ConnectionString))
        {
             data = db.Query<DapperTest>("select * from testTable").ToList();
        }

        return data;
    }

这两种方式都给我一个例外:

System.NullReferenceException: '对象引用未设置为对象的实例。'

我使用了以下资源:

.Net CORE Dapper Connection String?

https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/intro

Get connection string from App.config

但我错过了一些东西。我只设置了一次连接字符串,它不在 .Net Core 中,因此对其他人来说可能很明显。

【问题讨论】:

  • 哪一行出错了? NULL 是什么对象?
  • .NET 核心的配置方式不同。你有appsettings.json 吗?推荐的方法是将 appsettings 加载到您的 IConfigurationRoot 对象中并将其注入您的类中,然后从那里获取连接字符串
  • @Shyju 我在 c# 代码的以下行中得到对象为空:using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["Analysis"].ConnectionString))
  • @Jonesopolis 我确实尝试将连接字符串添加到 appsettings.json,如我上面的代码所示。我还没有尝试通过IConfigurationRoot 加载它
  • @Jonesopolis 我想为此使用Options Pattern 吗?

标签: c# asp.net asp.net-mvc .net-core dapper


【解决方案1】:

如果您使用的是 appsettings.json,请创建一个简单的 POCO 类来为您的连接字符串配置建模,如下所示:

public class ConnectionConfig
{
        public string Analysis {get;set;}
}

在 Startup.cs 的 ConfigureServices 方法中添加这一行

services.Configure<ConnectionConfig>(Configuration.GetSection("ConnectionStrings"));

数据服务类

class YourClass{
    private string _connectionString;

    YourClass(string connectionString){
       _connectionString = connectionString;
    }

    //Your implementation
    public List<DapperTest> ReadAll()
    {
        var data = new List<DapperTest>();
        using (IDbConnection db = new SqlConnection(_connectionString)
        {
            data = db.Query<DapperTest>("select * from testTable").ToList();
        }

       return data;
   }
}

在你的控制器构造函数中注入IOptions&lt;ConnectionConfig&gt;

class YourController : Controller{
   YourClass _testing;

   YourController(IOptions<ConnectionConfig> connectionConfig){
       var connection = connectionConfig.Value;
       string connectionString = connection.Analysis;
       _testing = new YourClass(connectionString );
    }
   public IActionResult Index() { 
        var testingData = _testing.ReadAll(); 
        return View(); 
     }
 }

【讨论】:

  • 这是一个巨大的帮助。一个简单的后续问题:在控制器中调用它时,我现在如何传递一个参数(特别是什么类型,因为我不熟悉IOptions)?例如,我将在这里作为参数传递什么:public IActionResult Index() { var testing = new YourClass(); var testingData = testing.ReadAll(); return View(); }
  • 您也可以在控制器的构造函数中注入 IOptions,并像我为 YourClass 所做的那样做同样的事情
  • 现在添加了 IOptions 的控制器实现
  • 我现在正在处理它,通过你的实现我仍然遇到错误:“无法从'字符串'转换为 IOptions”就在这里:_testing = new DataBaseData(connectionString)
  • 您确定要添加这一行,string connectionString = connection.Analysis; 吗?告诉我你的实现。从上面的部分很难得到错误
猜你喜欢
  • 2020-01-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2019-09-22
相关资源
最近更新 更多