我一直在尝试使用 ASP.NET Core 6 将我的应用程序连接到 SQL Server 数据库,但总是失败。我不知道我做错了什么。
失败的存储库代码:
result = db.QueryFirstOrDefault<tbUsers>(SqlQuery, parameters, commandType: CommandType.StoredProcedure);
错误:
System.InvalidOperationException:ConnectionString 属性尚未初始化。
InvalidOperationException:ConnectionString 属性尚未初始化。
System.Data.SqlClient.SqlConnection.PermissionDemand()System.Data.SqlClient.SqlConnection.PermissionDemand()
System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnectionouterConnection,DbConnectionFactoryconnectionFactory,TaskCompletionSource重试,DbConnectionOptionsuserOptions)
System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource重试)
System.Data.SqlClient.SqlConnection.Open()
SqlMapper.cs 中的 Dapper.SqlMapper.QueryRowImpl(IDbConnection cnn, Row row, ref CommandDefinition command, Type effectiveType) SqlMapper.cs 中的 Dapper.SqlMapper.QueryFirstOrDefault(IDbConnection cnn、字符串 sql、对象参数、IDbTransaction 事务、Nullable commandTimeout、Nullable commandType) UsersRepository.cs 中的 nickramen.DataAccess.Repositories.UsersRepository.Ingresar(字符串用户名,字符串密码)结果 = db.QueryFirstOrDefault(SqlQuery, 参数, commandType: CommandType.StoredProcedure);
AccountController.cs 中的 nickramen.WebUI.Controllers.AccountController.Login(UserViewModel 模型)var user = _usersRepository.Ingresar(model.用户名, model.密码);
lambda_method28(闭包,对象,对象[])
Microsoft.AspNetCore.Mvc.Infrastruct.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper 映射器、ObjectMethodExecutor 执行器、对象控制器、object[] 参数) Microsoft.AspNetCore.Mvc.Infrastruct.ControllerActionInvoker.InvokeActionMethodAsync()
这是我的代码:
Program.cs
:
using Microsoft.EntityFrameworkCore;
using nickramen.DataAccess.Entities;
using nickramen.DataAccess.Interfaces;
using nickramen.DataAccess.Repositories;
// Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("NickramenConnectionString"))
);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<IRolesRepository, RolesRepository>();
builder.Services.AddScoped<IUsersRepository, UsersRepository>();
builder.Services.AddScoped<IJobApplicationRepository, JobApplicationRepository>();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
这是我的
NickramenDbContext
:
// NickramenDbContext.cs
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
namespace nickramen.DataAccess
{
public class NickramenDbContext : DbContext
{
public NickramenDbContext(DbContextOptions<NickramenDbContext> options) : base(options)
{
}
public static string ConnectionString { get; set; } = "";
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(ConnectionString);
}
base.OnConfiguring(optionsBuilder);
}
}
}
这是
AppDbContext
(由 EF Core 逆向工程生成):
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
namespace nickramen.DataAccess.Entities;
public partial class AppDbContext : DbContext
{
public AppDbContext()
{
}
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public virtual DbSet<tbJobApplication> tbJobApplication { get; set; }
public virtual DbSet<tbPersons> tbPersons { get; set; }
public virtual DbSet<tbRoles> tbRoles { get; set; }
// rest of the code
}
这是
appsettings.json
文件:
// appsettings.json
{
"ConnectionStrings": {
"NickramenConnectionString": "Server=Insertserver;Database=Insertdb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
这是我的
Repository.cs
:
using Dapper;
using Microsoft.EntityFrameworkCore;
using nickramen.DataAccess.Entities;
using nickramen.DataAccess.Interfaces;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace nickramen.DataAccess.Repositories
{
public class UsersRepository : IUsersRepository
{
public tbUsers Ingresar(string Username, string Password)
{
const string SqlQuery = "UDP_Acce_tbUsers_Login";
var result = new tbUsers();
var parameters = new DynamicParameters();
parameters.Add("@usu_Username ", Username, DbType.String, ParameterDirection.Input);
parameters.Add("@usu_Password", Password, DbType.String, ParameterDirection.Input);
using (var db = new SqlConnection(NickramenDbContext.ConnectionString))
{
result = db.QueryFirstOrDefault<tbUsers>(SqlQuery, parameters, commandType: CommandType.StoredProcedure);
}
return result;
}
}
}
您收到的错误消息
The ConnectionString property has not been initialized.
始终意味着您的代码未获取连接字符串。抛出异常的代码试图获取可能是“”的NickramenDbContext.ConnectionString
。我这边做了一个测试,得到了这样的结果。
public class ApplicationDbContext : IdentityDbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public static string ConnectionString { get; set; } = "";
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(ConnectionString);
}
base.OnConfiguring(optionsBuilder);
}
public DbSet<Movie> Movie { get; set; }
}
所以我的想法是,您可以尝试对有问题的行中的连接字符串进行硬编码以进行测试,以查看此异常是否仍然存在。