c# - 在 Blazor .net 核心应用程序中查找连接字符串时出错
问题描述
我有一个带有 EF Core 5 的 .netcore 3.1 blazor 应用程序,并且在使用
Scaffold-DbContext "Name=MyDb" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyDb_Context -Force
如果我使用,一切正常
Scaffold-DbContext "Server=servername;Database=MyDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyDb_Context -Force
但我想避免在源代码中包含连接字符串。
一切都正确支架,但是,当我尝试将数据显示到列表时,出现此错误:
System.InvalidOperationException: A named connection string was used, but the name 'MyDb' was not found in the application's configuration. Note that named connection strings are only supported when using 'IConfiguration' and a service provider, such as in a typical ASP.NET Core application. See https://go.microsoft.com/fwlink/?linkid=850912 for more information.
下面是我的 appsettings.json 的代码:
{
"ConnectionStrings": {
"MyDb": "Server=servername;Database=MyDb;Integrated Security=True"
}
}
这是我的 MyDb_Context:
public partial class MyDb_Context : DbContext
{
public MyDb_Context()
{
}
public MyDb_Context(DbContextOptions<MyDb_Context> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer("Name=MyDb");
}
}
...
}
这是我的 Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
Configuration = configuration;
_env = env;
}
private readonly IWebHostEnvironment _env;
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
var connection = Configuration.GetConnectionString("MyDb");
services.AddDbContext<MyDb_Context>(options => options.UseSqlServer(connection));
}
...
}
这是我的服务中调用的内容:
public class MyDbService
{
public readonly MyDb_Context mydb_context;
public MyDbService(MyDb_Context mydbctx)
{
MyDb_Context = mydbctx;
MyDb_Context.Database.SetCommandTimeout(60);
}
public Task<List<MyDbTableName>> GetMyDbContent()
{
var usernames = mydb_context.usernames.Where(u => u.AppId == 2).ToListAsync();
return usernames ;
}
...
}
然后在我的 Razor 页面中,我使用以下代码:
@code{
private List<usernames> _usernames;
MyDbService mydbservice = new MyDbService(new MyDb_Context()); //I think this line is where it is breaking
protected override async Task OnInitializedAsync()
{
//Grab function from the service listed above
//Function:
_usernames = await mydbservice.GetMyDbContent();
}
}
我不知道为什么它找不到连接字符串,我什至可以在 startup.cs 上放置一个断点
optionsBuilder.UseSqlServer("Name=MyDb");
,它能够很好地读取连接字符串。
我还可以看到 DBContext 在尝试
services.toList();
和断点时被加载。
请帮忙,我已经做了一个多星期了,已经用尽了我的努力。
解决方案
- 在稍后由 DI 注入
MyDbService
的类中注册服务:Startup
public void ConfigureServices(IServiceCollection services)
{
//...other services
services.AddScoped<MyDbService>();
}
- 将服务注入组件
@* inject the service *@
@inject MyDbService mydbservice
//....
@code{
private List<usernames> _usernames;
//DO NOT instianate the service, it's injected
// MyDbService mydbservice = new MyDbService(new MyDb_Context()); //I think this line is where it is breaking
protected override async Task OnInitializedAsync()
{
//Grab function from the service listed above
//Function:
_usernames = await mydbservice.GetMyDbContent(); //now it's working
}
}
- 修改 MyDbService 的 Constructor 中的下一行:
// MyDb_Context = mydbctx; //invalid
mydb_context = mydbctx;
使用Scaffold-DbContext
命名连接是有效的,因为我们使用的是 DI。
Scaffold-DbContext "Name=MyDb" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context MyDb_Context -Force
我测试了这个解决方案,它工作正常。
推荐阅读
- c# - 从设备 modbus C# 读取响应
- java - 拼图“需要传递”不起作用
- c# - 如何通过 OData 隐藏 EF Context 数据库架构?
- php - 在 PHP 中,StdClass 的值可以是另一个键的值吗?
- javascript - 当命名函数回调不需要参数时调用什么?
- r - 如何正确转义引号?
- oracle - 未定义值的顺序时,Oracle Insert Into 如何工作?
- php - 设置 MySQL php artisan migrate - SQLSTATE[HY000] [2002] 没有这样的文件或目录
- sql - 从SQL中的文本中提取年份
- google-apps-script - 如何自定义弹出窗口,如 Snackbar 或带有消息的通知对话框?