如何将 ASP.NET Core 6 MVC 应用程序连接到 SQL Server 数据库?我不知道如何配置Program.cs

问题描述 投票:0回答:1

我一直在尝试使用 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;
        }
    }
}
entity-framework-core database-connection asp.net-core-6.0
1个回答
0
投票

您收到的错误消息

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; }

}

所以我的想法是,您可以尝试对有问题的行中的连接字符串进行硬编码以进行测试,以查看此异常是否仍然存在。

© www.soinside.com 2019 - 2024. All rights reserved.