【问题标题】:.Net Core 2 EF core connection string problem.Net Core 2 EF核心连接字符串问题
【发布时间】:2019-03-10 14:51:20
【问题描述】:

这是我的 appsettings.json

 "ConnectionStrings": {
    "Circolari": "Server=abcde;Database=Circolari;Trusted_Connection=True;"
  }

这是我的 startup.cs

 public Startup(IConfiguration configuration, IHostingEnvironment env)
 {
        Configuration = configuration;
        IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        Configuration = configurationBuilder.Build();
 }


 // This method gets called by the runtime. Use this method to add services to the container.

    public void ConfigureServices(IServiceCollection services)
    {
        //Circolari
        string connectoionString = Configuration.GetConnectionString("Circolari");
        services.AddDbContext<CircolariContext>(options => options.UseSqlServer(connectoionString));
        services.AddMvc();
    }

所以当我进行查询时

using (CircolariContext db = new CircolariContext(new DbContextOptions<CircolariContext>()))
{
   List<Argomenti> listaArgomenti = db.Argomenti.ToList();
}

我有问题:处理请求时发生未处理的异常。

InvalidOperationException:使用了命名连接字符串,但在应用程序的配置中找不到名称“Circolari”。请注意,仅在使用“IConfiguration”和服务提供者时才支持命名连接字符串,例如在典型的 ASP.NET Core 应用程序中。请参阅https://go.microsoft.com/fwlink/?linkid=850912 了解更多信息。

Microsoft.EntityFrameworkCore.Storage.Internal.NamedConnectionStringResolverBase.ResolveConnectionString(string connectionString)

有人可以帮我吗?

【问题讨论】:

  • 您确定您的appSettings.json 正在加载吗?您已将其标记为可选,因此如果 env.ContentRootPath 不是正确的文件夹,则不会加载它。尝试将其标记为optional: false 以查看它是否引发异常。
  • 您的“所以当我进行查询时”的示例代码不使用依赖注入,是生成错误的实际代码吗?我想知道如果是这样,错误是如何获取连接字符串名称“Circolari”的......
  • @John 我认为配置已加载,因为如果我在 ConfigureServices 中放置一个断点,则会读取字符串,并且使用 optional: false 错误仍然存​​在
  • @Moho 这是实际代码,与我在我的小示例中编写的用于在 .net 核心上配置 ef 核心的代码相同
  • 使用optional: false

标签: c# entity-framework ef-core-2.0 ef-core-2.1


【解决方案1】:

YouContextFile.cs添加此代码

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
               // add IConfigurationRoot  to get connection string 
                IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                .AddJsonFile("appsettings.json")
                .Build();
                optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"), x => x.UseNetTopologySuite());
            }
        }

【讨论】:

  • 将此添加到我的上下文中已经解决了我无法搭建新控制器的问题。
【解决方案2】:

修改startup.cs

public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<DB_A6136B_MiGranCitaContext>(options =>
             options.UseSqlServer(Configuration.GetConnectionString("MiGranCitaDB")));

然后使用选项 API CONTROLLER WITH ACTIONS USING ENTITY FRAMEWORK 添加控制器

【讨论】:

    【解决方案3】:

    终于找到了解决问题的方法:

    现在在 asp.net 核心中必须注入所有内容,因此您可以通过 ServiceProvider 获取数据库上下文(就像编译器告诉我的那样)

    //this is the constructor
    public EfGiacenzeRepo(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }
    
    
    //this is the method
    using (_aspContext = _serviceProvider.GetService<aspContext>())
    {
        listaGiacenze = _aspContext.TabGiacenza.ToList();
    }
    

    【讨论】:

      【解决方案4】:

      我看到了同样的错误消息,但这里的解决方案都没有为我解决这个问题。

      我的问题是在我的 DEV 环境中,我有多个项目被选为启动项目。

      在这种情况下,Visual Studio 似乎不知道在哪里查找 appsettings.json 文件。

      暂时切换到单个启动项目可以解决这个问题,所以当我需要使用 Scaffold-DbContext 重建数据库模型时,我会这样做。

      【讨论】:

        猜你喜欢
        • 2020-01-07
        • 2021-03-09
        • 2019-09-22
        • 2018-05-28
        • 1970-01-01
        • 2017-05-02
        • 2020-04-14
        • 1970-01-01
        相关资源
        最近更新 更多